Go每天一篇(day65)----defer(),recover(),painc()進階

一、今日題目
  1. flag是bool型變量,下面if表達式符合編碼規範的是?
    A.if flag
    B.if flag
    C.if flag==false
    D.if !flag

  2. 下面的代碼輸出什麼,請說明:

    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

三、解析:
  1. flag是bool型,不能與int類型的0,1做比較。可以跟true或者false進行比較。

  2. 首先,第一個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()
最後,解析若有錯誤之處,歡迎指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章