// 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) } } // 运行程序,确定文件在写入后被关闭