go 隨聊-defer延遲呼叫
阿新 • • 發佈:2018-12-19
本文只適合想要進階學習 Golang 的新手閱讀,大牛請繞道。
Go 語言中的 defer
語句是 UNIX 之父 Ken Thompson
大神發明的, 是完全正交的設計。
簡化資源的回收
這是最常見的 defer
用法. 比如:
mu.Lock()
defer mu.Unlock()
panic
異常的捕獲
defer
除了用於簡化資源的釋放外, 還是Go語言異常框架的一個組成部分。
Go語言中,panic
用於丟擲異常, recover
用於捕獲異常。
recover
只能在defer
語句中使用, 直接呼叫recover
是無效的。
Defer函式使用的坑
被defer的呼叫會在包含的函式的末尾執行,而不是包含程式碼塊的末尾。
import "fmt" func Open(){ fmt.Println("Open") } func Close(){ fmt.Println("Close") } func main() { fmt.Println("開始") for i:=0;i<3;i++{ Open() fmt.Println("do something") defer Close() } fmt.Println("結束") } --------------------------------------------- 開始 Open do something Open do something Open do something 結束 Close Close Close
如上程式碼,本來意圖是在for迴圈中,open之後,再close釋放相關資源,但是結果缺並不是想象的那樣。因為defer不會在程式碼塊生效,只會在它所在的函式生效。
正確做法是這樣:
import "fmt" func Open(){ fmt.Println("Open") } func Close(){ fmt.Println("Close") } func main() { fmt.Println("開始") for i:=0;i<3;i++{ func(){ Open() fmt.Println("do something") defer Close() }() } fmt.Println("結束") } --------------------------------------------- 開始 Open do something Close Open do something Close Open do something Close 結束