大家好,我是 frank ,「 Golang 語言開發棧」公眾號作者。 01 介紹 defer 的使用方式是在其後緊跟一個函數調用或方法調用,確保在其所在的函數體返回之前執行其調用的函數或方法。 在 Go 語言中,defer 一般用於資源釋放,或使用 defer 調用一個匿名函數,在匿名函數中使用 ...
大家好,我是 frank ,「 Golang 語言開發棧」公眾號作者。
01 介紹
defer 的使用方式是在其後緊跟一個函數調用或方法調用,確保在其所在的函數體返回之前執行其調用的函數或方法。
在 Go 語言中,defer 一般用於資源釋放,或使用 defer 調用一個匿名函數,在匿名函數中使用 recover()
處理異常 panic
。
在使用 defer
時,也很容易遇到陷阱,本文我們介紹使用 defer
時有哪些陷阱。
02 defer
陷阱
defer 語句不可以在 return 語句之後。
示例代碼:
func main() {
name := GetUserName("phper")
fmt.Printf("name:%s\n", name)
if name != "gopher" {
return
}
defer fmt.Println("this is a defer call")
}
func GetUserName(name string) string {
return name
}
輸出結果:
name:phper
閱讀上面這段代碼,我們在 return
語句之後執行 defer
語句,通過輸出結果可以發現 defer 語句調用未執行。
雖然 defer
可以在函數體中的任意位置,我們也是需要特別註意使用 defer
的位置是否可以執行。
defer 語句執行匿名函數,參數預處理。
示例代碼:
func main() {
var count int64
defer func(data int64) {
fmt.Println("defer:", data)
}(count + 1)
count = 100
fmt.Println("main:", count)
}
輸出結果:
main: 100
defer: 1
閱讀上面這段代碼,首先我們定義一個類型為 int64
的變數 count
,然後使用 defer
語句執行一個匿名函數,匿名函數傳遞參數為 count + 1
,最終 main
函數輸出 100
,defer 執行的匿名函數輸出 1
。
因為在執行 defer
語句時,執行了 count + 1
,並先將其存儲,等到 defer
所在的函數體 main
執行完,再執行 defer
語句調用的匿名函數的函數體中的代碼。
03 總結
本文主要介紹在使用 defer
語句時可能會遇到的陷阱。分別是 defer
語句不可以在 return
語句之後;defer
語句執行的匿名函數,匿名函數的參數會被預先處理。
讀者朋友們在使用 Go 語言的 defer
語句時,還遇到過哪些陷阱?