Go函数里面提供了defer关键字,可以注册多个延迟调用,这些调用以先进后出(FILO)的顺序在函数返回前被执行。这点有点类似java语言中异常处理中的的finaly子句,defer常用于保证一些资源最终一定能够得到回收和释放。
package main
func main() {
//先进后出
defer func() {
println("first")
}()
defer func() {
println("second")
}()
println("function body")
}
function body
second
first
defer后面必须是函数或者方法的调用,否则会报错。
defer函数的实参在注册时通过值拷贝传递进去,下面示例的代码中,实参a额值在defer注册时通过值拷贝方式传递进去,后续语句a++并不会影响defer语句最后的输出结果。
func f() int {
a := 0
defer func(i int) {
println("defer i=", i)
}(a)
a++
return a
}
//defer 打印结果
defer i=O
defer 语句必须先注册后才能执行,如果 defer 位于 return 之后,则defer因为没有注册,不会执行。
package main
func main() {
defer func() {
println("first")
}()
a := 0
println(a)
return
defer func() {
println("second")
}()