一、今日題目
-
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()。
最後,解析若有錯誤之處,歡迎指正。