【go】go panic结束流程

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

}

【go】go panic结束流程

调用panic后会结束后续的流程,defer可以继续执行,但是println("a done")还是输出了了结果,照理来说panic调用后这部分应该也不能输出的为啥能输出“a done”?

【go】go panic结束流程

a done在外面的

使用了recover从恐慌中恢复,而且恢复恐慌的defer被嵌套在内部匿名函数里面了,你可以把这一部分看成是调用的另一个函数,defer会在panic之后执行,由于恢复了恐慌,自然不会影响a done 的输出

回答

以上是 【go】go panic结束流程 的全部内容, 来源链接: utcz.com/a/115201.html

回到顶部