Go 語言中 defer 使用時有哪些陷阱?

可可西里發表於2024-01-21

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 語句執行的匿名函式,匿名函式的引數會被預先處理。


來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70036623/viewspace-3004586/,如需轉載,請註明出處,否則將追究法律責任。

相關文章