美文网首页golang
Go语言学习笔记08.defer

Go语言学习笔记08.defer

作者: 快乐的提千万 | 来源:发表于2019-11-05 16:44 被阅读0次

    defer

    defer可以说是go的一个很牛逼的功能了,将函数暂存,延时执行。
    defer语句只能出现在函数或方法的内部。表明在当前函数执行完了再执行要延时的函数。哪怕当前函数崩了。
    defer语句经常被用于处理成对的操作,如打开、关闭、连接、断开连接、加锁、释放锁。通过defer机制,不论函数逻辑多复杂,都能保证在任何执行路径下,资源被释放。释放资源的defer应该直接跟在请求资源的语句后。
    比如,我在当前函数申请了一堆资源,或者加上了锁,然后用defer延时调用一个释放资源、释放锁的函数。保证不会锁死,哪怕当前函数崩了,也不会锁死。

    package main //必须
    
    import "fmt"
    
    func main() {
        a := 10
        b := 20
    
        defer func(a, b int) {
            fmt.Printf("a = %d, b = %d\n", a, b) //a = 10, b = 20
        }(a, b) 
    
        defer func(a, b int) {
            fmt.Printf("传进来:a = %d, b = %d\n", a, b) //传进来:a = 10, b = 20
            a = 100
            fmt.Printf("改了之后:a = %d, b = %d\n", a, b) //改了之后:a = 100, b = 20
        }(10, 20) //()代表调用此匿名函数, 把参数传递过去,已经先传递参数,只是没有调用
    
        
        b = 222
        //这里会是还没改的 
        fmt.Printf("外部:a = %d, b = %d\n", a, b) //外部:a = 10, b = 222
        
        //故意挂掉
        result := 100 / 0
        
        /**打印顺序
            外部:a = 10, b = 222
            传进来:a = 10, b = 20
            改了之后:a = 100, b = 20
            a = 10, b = 20
            报错:go:24:16: division by zero
        */
    }
    
    

    通过执行顺序可以看出来,延时的顺序也是栈的顺序。

    相关文章

      网友评论

        本文标题:Go语言学习笔记08.defer

        本文链接:https://www.haomeiwen.com/subject/akkebctx.html