第一种:

func main() {
    defer func() {
        fmt.Println("这是第一个defer")
    }()

    defer func() {
        fmt.Println("这是第二个defer")
    }()

    defer func() {
        fmt.Println("这是第三个defer")

        defer func() {fmt.Println("这是第三个defer里面嵌套的defer")}()

    }()

    defer func() {fmt.Println("这是第四个defer")}()
}

从这里可以看出defer按照顺序执行,按照栈的先进后出的顺序来操作。


第二种:

func main() {
    defer func() {
        panic("这是第一个defer里的panic")
    }()
    defer func() {fmt.Println("这是第二个defer")}()
    panic("这是第二个panic")
}

倘若不注释掉最底下的painc,他就直接报错。
当注释过后:

第三种:

func main() {
   defer func() {
       panic("这是第一个defer里的panic")
   }()
   defer func() {fmt.Println("这是第二个defer")}()
   //panic("这是第二个panic")
}

他的打印内容就是

这是第二个defer
panic: 这是第一个defer里的panic

这完美的按照了先进后出的defer顺序,那么再看下一个:

第四种:

func main() {
    defer func() {
        defer func() {fmt.Println("这是第一个defer")}()
        panic("这是第一个defer里的panic")
    }()
    defer func() {fmt.Println("这是第二个defer")}()
    //panic("这是第二个panic")
}

大家猜这个执行顺序是什么?


打印内容:

这是第二个defer
这是第一个defer
panic: 这是第一个defer里的panic

这样来看是不是有点疑惑。
为什么当panic不是defer包括时,他最先执行,他理应执行第一个defer时就直接报错,如第二种一样。
而不是先打印defer里面fmt输出的内容,然后才是报错。
于是我们不应该在defer里面再内嵌一个panic
就算是使用这种,也应该明确的知道他们的执行顺序。

最后修改:2021 年 07 月 19 日
如果觉得我的文章对你有用,请随意赞赏