在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/GO/ go panic結(jié)束流程

go panic結(jié)束流程

func test_1(){

exit:=make(chan struct{})
go func() {
    defer close(exit)
    defer println("exit")
    func(){
        defer func() {
            println("b:",recover()==nil,recover())
        }()
        func (){
            println("c")
            //runtime.Goexit()
            panic("panic done")
            println("c done")

        }()
        println("b done")
    }()
    println("a done")
}()
<-exit

}

clipboard.png

調(diào)用panic后會結(jié)束后續(xù)的流程,defer可以繼續(xù)執(zhí)行,但是println("a done")還是輸出了了結(jié)果,照理來說panic調(diào)用后這部分應(yīng)該也不能輸出的為啥能輸出“a done”?

回答
編輯回答
黑與白

clipboard.png

a done在外面的

2017年3月7日 16:25
編輯回答
毀了心

使用了recover從恐慌中恢復(fù),而且恢復(fù)恐慌的defer被嵌套在內(nèi)部匿名函數(shù)里面了,你可以把這一部分看成是調(diào)用的另一個(gè)函數(shù),defer會在panic之后執(zhí)行,由于恢復(fù)了恐慌,自然不會影響a done 的輸出

2018年8月24日 14:04