第一种:
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
就算是使用这种,也应该明确的知道他们的执行顺序。