關於go語言中的defer\panic\recover
阿新 • • 發佈:2018-11-25
defer的作用
類似其他語言的finally{},可以非常方便地在獲得資源之後直接defer釋放資源,保證資源釋放,或者其他的一些處理工作
defer的執行時機
在函式體執行完成之後,回到呼叫點之前。這意味這你可以在defer中修改return的值
函式中出現了錯誤(panic)defer中能夠執行到麼
大部分情況下都可以。極端情況如記憶體耗盡這樣的會直接結束程式。
recover之後的函式返回值是什麼?
這個問題是我最疑惑的,我們來使用一段程式碼實驗一下:
package main import ( "fmt" ) func bigest(nums ...int) int { defer func(){ if p := recover(); p != nil { fmt.Println("執行了recover", p) } }() result := 100 for i := 0; i < len(nums); i++ { val := nums[i] fmt.Println("handle:", val, result) if val == 3 { panic("不會數3") } if val > result { result = val } } return result } func main(){ largest := bigest(1,2,3,4) fmt.Println("largest:", largest) }
結果每次輸出的最大值都是0。結論很明顯:panic之後的函式recover之後會返回返回型別的0值,可以改變一下返回的型別試試
什麼時候使用panic
無法預期的 錯誤,可預期的錯誤一般使用error返回值
什麼時候使用recover
無法緊要的任務出錯了,不想因此奔潰程式,可以使用recover僅僅記錄一條日誌