// Defer 用于确保稍后在程序执行执行函数调用,通常用于清理目的。
// 在其他编程语言中,defer通常用于ensure或者finally中。
package main
import (
"fmt"
"os"
)
func main() {
// 使用createFile获取一个文件对象后,
f := createFile("./43-defer.txt")
// f = createFile("/defer.txt"),运行后将会报错
// 立即使用defer和closeFile将该文件关闭,
// 这将在writeFile函数执行完成后,在封闭函数main的末尾执行
defer closeFile(f)
writeFile(f)
}
func createFile(p string) *os.File {
fmt.Println("creating")
f, err := os.Create(p)
if err != nil {
panic(err)
}
return f
}
func writeFile(f *os.File) {
fmt.Println("writing")
fmt.Fprintf(f, "The file is generated by 43-defer.go.")
}
func closeFile(f *os.File) {
fmt.Println("closing")
// 关闭文件是检查错误很重要
// 即使是在defer中也是如此
err := f.Close()
if err != nil {
fmt.Fprintf(os.Stderr, "error:%v\n", err)
os.Exit(1)
}
}
// 运行程序,确定文件在写入后被关闭