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

}

clipboard.png

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

阅读 2.1k
2 个回答

clipboard.png

a done在外面的

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题