在线文档  >   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

运行该程序,确认文件在写入后再关闭。