golang recover、panic函数调用传播

golang中恐慌的恢复传播方式总是记不住,故此记载

func main() {
    // 每个未恢复的恐慌与此协程调用栈中的一个尚未退出的函数相关联
    go func() {
        defer func() {
            // 最终恢复的恐慌是恐慌2
            fmt.Println(recover())
        }()
        // 该函数调用退出时恐慌2将蔓延替换恐慌0与外层函数相关联
        defer func() {
            // 新传播出来的恐慌2将蔓延替换恐慌1与外层函数相关联
            defer panic(2)

            // 调用完毕恐慌1将蔓延到外层与外层匿名函数相关联
            func() {
                panic(1)
            }()
        }()
        // 与最外层函数相关联
        panic(0)
    }()
    select {}
}

其他需要注意的是:

  • panic只会触发当前goroutine的延迟调用函数
posted @ 2020-10-13 17:35  王渝钦  阅读(79)  评论(0)    收藏  举报