Defer用于确保稍后在程序执行中执行函数调用,通常用于清理目的。延迟(defer
)常用于例如,ensure
和finally
常见于其他编程语言中。
假设要创建一个文件,写入内容,然后在完成之后关闭。这里可以这样使用延迟(defer
)处理。
在使用createFile
获取文件对象后,立即使用closeFile
推迟该文件的关闭。这将在writeFile()
完成后封装函数(main
)结束时执行。
运行程序确认文件在写入后关闭。
所有的示例代码,都放在
F:\worksp\golang
目录下。安装Go编程环境请参考:/tutorial/detail-5562.html
panic.go
的完整代码如下所示 -
package main import "fmt" import "os" // Suppose we wanted to create a file, write to it, // and then close when we're done. Here's how we could // do that with `defer`. func main() { // Immediately after getting a file object with // `createFile`, we defer the closing of that file // with `closeFile`. This will be executed at the end // of the enclosing function (`main`), after // `writeFile` has finished. f := createFile("defer-test.txt") 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.Fprintln(f, "data") } func closeFile(f *os.File) { fmt.Println("closing") f.Close() }
执行上面代码,将得到以下输出结果 -
F:\worksp\golang>go run defer.go creating writing closing