在线文档 > Golang练习 > Defer
在Go中,defer
用于确保函数调用在程序的执行过程中稍后执行,通常用于清理资源。在其他一些语言中可能会使用 ensure 或 finally 来完成类似的工作。
package main
import (
"fmt"
"os"
)
// 假设我们想要创建一个文件、向其写入内容,并在完成后关闭文件。
// 下面是如何使用 defer 实现这个过程的代码。
func main() {
// 在使用 `createFile` 获取文件对象之后,使用 `defer` 关键字将关闭该文件函数 `closeFile` 延迟执行。
// 这将在包含函数(`main`)执行结束后,在 `writeFile` 完成后执行。
f := createFile("/tmp/defer.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")
err := f.Close()
// 关闭文件时检查是否有错误,即使在延迟函数中也要这样做。
if err != nil {
fmt.Fprintf(os.Stderr, "error: %v\n", err)
os.Exit(1)
}
}
运行结果如下:
$ go run defer.go
creating
writing
closing
运行该程序,确认文件在写入后再关闭。