Go的defer

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