相似其餘語言的finally{},能夠很是方便地在得到資源以後直接defer釋放資源,保證資源釋放,或者其餘的一些處理工做函數
在函數體執行完成以後,回到調用點以前。這意味這你能夠在defer中修改return的值日誌
大部分狀況下均可以。極端狀況如內存耗盡這樣的會直接結束程序。code
這個問題是我最疑惑的,咱們來使用一段代碼實驗一下:內存
package main import ( "fmt" ) func biggest(nums ...int) int { defer func(){ if p := recover(); p != nil { fmt.Println("執行了recover", p) } }() result := 100 for _, val := range nums { fmt.Println("handle:", val, result) if val == 3 { panic("不會數3") } if val > result { result = val } } return result } func main(){ largest := biggest(1,2,3,4) fmt.Println("largest:", largest) }
結果每次輸出的最大值都是0。結論很明顯:panic以後的函數recover以後會返回返回類型的0值,能夠改變一下返回的類型試試資源
沒法預期的 錯誤,可預期的錯誤通常使用error返回值class
沒法緊要的任務出錯了,不想所以奔潰程序,能夠使用recover僅僅記錄一條日誌import