在Go语言中,defer 用于延迟函数或方法的执行。当一个函数或方法被 defer 时,它会被推迟到当前函数返回之前执行。通常情况下,defer 被用来释放资源、解锁互斥锁、关闭文件等。
使用 defer 的好处是可以保证在任何情况下都能够执行需要执行的代码,例如:
func foo() {
// 创建一个文件
f, err := os.Create("example.txt")
if err != nil {
// 错误处理
return
}
// 在函数结束时关闭文件
defer f.Close()
// 写入数据到文件
_, _ = fmt.Fprintln(f, "Hello, World!")
}
上面的例子中,在 f.Close() 函数之前可能会有其他代码抛出异常导致程序退出,但是由于使用了 defer 关键字,我们仍然能够保证最终关闭该文件。
另外需要注意的一点是,defer 的调用顺序是后进先出(LIFO)的。也就是说,在同一个函数中多个 defer 语句的执行顺序与它们定义时的顺序相反。例如:
func bar() {
defer fmt.Println("2")
defer fmt.Println("1")
}
这里 bar() 函数返回前将会依次输出 “1” 和 “2”。




