在go语言里,defer可是实现延迟函数调用。语句defer向当前函数注册稍后执行的函数调用。这些调用被称做延迟调用,因为它们知道当前函数执行结束前才被执行,常用于资源释放、解除锁定,以及错误处理等操作。
func main() {
f, err := os.Open("./main.go")
if err != nil {
log.Fatal(err)
}
defer f.Close() //仅注册,直到main退出前才执行
println("hello world")
}
延迟调用注册的是调用,必须提供执行所需参数(哪怕为空)。参数值在注册时被复制并缓存起来。如对状态敏感,可改用指针。
func main() {
x, y := 1, 2
defer func(a int) {
println("defer x, y =",a, y) //y为闭包引用
}(x) //注册时复制调用参数
x += 100 //对x的修改不会影响延迟调用
y += 200
println(x, y)
}
输出:
101 202
defer x, y = 1 202