第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

Golang defer總結(jié)

標(biāo)簽:
Go

0

Golang有一个特殊的控件语句,那就是defer,defer语句用于延迟调用指定的函数,比如释放资源等,它会在函数最后执行,但在return之前,先让我们看代码简单了解下:

package main

func main() {
    test()
}func test() {
    println("test1")    defer func() {
        println("defer test2")
    }()
    println("test3")
}

执行结果如下:

test1
test3
defer test2

很清楚地看到,有defer那个函数最后才执行的

现在改一下代码,让代码panic,当抛出异常时,defer延迟函数还会执行吗?

package main

func main() {
    test()
}func test() {

    println("test1")
        panic("panic")    defer func() {
        println("defer test2")
    }()
    
    println("test3")
}

输出

test1
panic: panic

Process finished with exit code 2

延迟函数居然没有执行,为什么会这样呢?是因为panic在延迟函数之前了,再改一下代码如下

package main

func main() {
    test()
}func test() {

    println("test1")    defer func() {
        println("defer test2")
    }()
    panic("panic")
    println("test3")
}

输出

test1
defer test2
panic: panic

延迟函数执行了,可以看到panic在延迟函数之前延迟函数是执行不了的,毕竟抛出异常。

1

再看一个例子

package main

func main() {
   test()
}func test() {   for i:=0;i<5 ;i++  {       defer func() {
           println(i)
       }()
   }
}

输出

5
5
5
5
5

Process finished with exit code 0

是不是觉得很惊诧啊,是的,为什么不是0 1  2 3 4 啊?
这正是因为延迟函数执行时机引起的,当println(i)时,i已经是5了,跳出了for循环,如果延迟函数要使用外部的变量应该通过参数传入,看下面

package main

func main() {
    test()
}func test() {    for i := 0; i < 5; i++ {        defer func(i int) {
            println(i)
        }(i)
    }
}

输出

4
3
2
1
0

Process finished with exit code 0

对了吧,哎哎哎,不对啊,怎么反过来了?
其实延迟函数是一个栈,先进后出最后放进去的最后出来,我们再试一个是不是这样

package main

func main() {
    test()
}func test() {     defer func() {
        println("test1")
     }()     defer func() {
        println("test2")
     }()
}

输出

test2
test1
Process finished with exit code 0

果真如此。

2.总结

看了上边的例子,最后我们总结一下,学过的东西如果不好好总结,会很快忘记的,打算以后看的书都全部写出来,这样书才没有白读啊
我们规定一下,上边test()方法为外围函数,调用test()的叫调用函数,调用与被调用区分开,总结如下

  1. 当外围函数正常执行完毕时,只有其中的延迟函数都执行完毕时,外围函数才会真正执行完

  2. 当外围函数执行return时,只有延迟函数全都执行完时,才会真正地返回

  3. panic在延迟函数后边,只有延迟函数执行完毕时,panci才会扩散到调用函数

  4. 延迟函数总是会在外围函数执行前执行,除非延迟函数前面已经panic了

  5. defer语句在外围函数的函数体中位置不限,数量不限

  6. 如果延迟函数要使用外部的变量应该通过参数传入

  7. 迟延函数是一个栈,先进后出



作者:想入飞飞___
链接:https://www.jianshu.com/p/772b9a1220ae

點(diǎn)擊查看更多內(nèi)容
1人點(diǎn)贊

若覺得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消