##第一种:## ``` 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* 就算是使用这种,也应该明确的知道他们的执行顺序。 Loading... ##第一种:## ``` 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 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏