一、今日题目
-
flag是bool型变量,下面if表达式符合编码规范的是?
A.if flag
B.if flag
C.if flag==false
D.if !flag -
下面的代码输出什么,请说明:
func main() { defer func() { fmt.Print(recover()) }() defer func() { defer func() { defer fmt.Print(recover()) }() panic(1) }() defer recover()//无效 panic(2) }
二、答案:
1.BCD
2.输出结果:12
三、解析:
-
flag是bool型,不能与int类型的0,1做比较。可以跟true或者false进行比较。
-
首先,第一个defer执行,将recover()压入栈中,其次第二个defer执行压入栈的第二层,然后第二个defer中又嵌套一个defer,将嵌套的defer压入第二个defer的defer栈中第一层,继续往下执行,遇到panic,抛出panic(1)。遇到panic程序不会立刻上传,而是将defer执行完。根据defer知识。defer是最后再执行,第二个defer执行完继续往下执行,遇到panic(2),抛出panic(2),然后回去调用第五行的defer,然后调用panic(1),然后panic(1)会调用第7行的recover被捕获并打印出1,最后继续执行第三行,panic(2)被捕获并打印2。最后输出1,2
实例:func main() { defer func() { fmt.Print(recover()) }() defer func() { defer func() { fmt.Println(22) defer fmt.Println(recover()) fmt.Println(333) }() panic(111) fmt.Println(444) }() fmt.Println(555) defer recover()//无效 panic(2) fmt.Println(666) }
运行结果:
555
22
333
111
2
解析实例:
首先,将第一个defer压入栈中,其次将第二个defer压入第二层,然后第二个defer中又嵌套一个defer,将嵌套的defer压入第二个defer的defer栈中第一层,继续往下执行,遇见panic,程序不会立刻停止,而是将defer执行完。第三步依次执行并输出555,往下运行,defer recover()无效,继续往下执行,遇到panic(2),根据defer的先进后出原则,调用第二个defer。往下执行遇到defer(),跳过往下执行,遇到panic(111),然后调用嵌套中的defer,依次执行,输出22,遇见defer,捕获panic(111),继续往下执行输出333,再输出捕获的panic里面的111。最后调用第一个defer,捕获panic(2)并打印输出2。
defer,panic,recover的相关知识参考Go每天一篇(day64)----panic()和recover()。
最后,解析若有错误之处,欢迎指正。