defer
⽤于延迟一个函数或者方法(或者当前所创建的匿名函数)的执行,并且defer语句只能出现在函数或方法的内部.
defer
语句经常被用于处理成对的操作,如文件的打开与关闭、连接的建立与断开、加锁、释放锁.
通过defer
机制,不论函数逻辑多复杂都能保证在任何执行路径下资源被释放.释放资源的defer
应该直接跟在请求资源的语句后.
如果一个函数中有多个defer
语句,它们会以后进先出的顺序执行,哪怕函数或某个延迟调用发生错误,这些调用依旧保证会被执⾏.
多个defer
:
func test(x int) {
fmt.Println(1 / x)//x为0时,产生异常
}
func main() {
defer fmt.Println("aaaaaaaa")
defer test(0)
defer fmt.Println("bbbbbbbb")
defer fmt.Println("cccccccc")
}
输出:
cccccccc
bbbbbbbb
aaaaaaaa
panic: runtime error: integer divide by zero
defer
和匿名函数:
func main() {
a, b := 10, 20
defer func(x int) {
fmt.Println("defer: a = %d, b = %d\n", x, b)// b 闭包引用
}(a)
a += 10
b += 100
fmt.Printf("a = %d, b = %d\n", a, b)
}
输出:
a = 20, b = 120
defer: a = 10, b = 120