這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
golang沒有類似C中的try catch finlly,但是提供了defer revover panic
defer“延遲” 函數調用返回之前按照先進先出的順序進行調用defer中的函數。
使用規則:1.defer函數中的參數值再定義時即進行計算。
func a() { i := 0 defer fmt.Println(i) i++ return}
先進後出原則
func b() { for i := 0; i < 4; i++ { defer fmt.Print(i) }}
可以讀取並設定傳回值
func c() (i int) { defer func() { i++ }() return 1}
panic "恐慌"函數執行時,意味著函數進入恐慌模式,拋出異常。如果函數有panic函數執行,則想上一層調用者返回panci資訊,上一層也按照此邏輯執行,如果goroutine沒有處理panic資訊,則goroute會異常崩潰,如果是主goroute,則程式崩潰。
#
recover“恢複”用於處理panic拋出的異常資訊
package mainimport "fmt"func main() { f() fmt.Println("Returned normally from f.")}func f() { defer func() { if r := recover(); r != nil { fmt.Println("Recovered in f", r) } }() fmt.Println("Calling g.") g(0) fmt.Println("Returned normally from g.")}func g(i int) { if i > 3 { fmt.Println("Panicking!") panic(fmt.Sprintf("%v", i)) } defer fmt.Println("Defer in g", i) fmt.Println("Printing in g", i) g(i + 1)}其輸出結果為:Calling g.Printing in g 0Printing in g 1Printing in g 2Printing in g 3Panicking!Defer in g 3Defer in g 2Defer in g 1Defer in g 0Recovered in f 4Returned normally from f.作者:CodingTech連結:http://www.jianshu.com/p/f76b9ce083c4來源:簡書著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。