golang

Go语言学习笔记08.defer

2019-11-05  本文已影响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
    */
}

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

上一篇 下一篇

猜你喜欢

热点阅读