【Go学习】一道简单Golang面试题中关于panic和defer的执行顺序引发的惨案
题目有点夸张,标题党一把,哈哈,不过也确实是在一个小的面试中碰到这个题目,然后当时经过我反复斟酌之后,愉快的写下了一个错误的答案,回来之后,自己验证了一下,于是就有了这篇文章,大神请绕道。
废话不多说直接上题目,说有如下程序(main.go),写出运行之后的结果:
package main
import "fmt"
func main(){
defer_call()
fmt.Println("333 Helloworld")
}
func defer_call() {
defer func(){
fmt.Println("11111")
}()
defer func(){
fmt.Println("22222")
}()
defer func() {
if r := recover(); r!= nil {
fmt.Println("Recover from r : ",r)
}
}()
defer func(){
fmt.Println("33333")
}()
fmt.Println("111 Helloworld")
panic("Panic 1!")
panic("Panic 2!")
fmt.Println("222 Helloworld")
}
我直接贴出运行结果:
111 Helloworld
33333
Recover from r : Panic 1!
22222
11111
333 Helloworld
如果你做对了,建议跳过。其实我也只是把自己的验证过程记录如下,以便以后查阅。
我们用上一篇文章所搭建的golang的gdb调试环境来具体分析下为什么会是这个结果。
编译源代码使用以下命令, 这里的-l
参数的意思和上面一样, 如果有需要还可以加-N
参数: