Go 語言中 defer 使用時有哪些陷阱?
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Go語言中defer的一些坑Go
- go語言中遍歷陣列的方法有哪些Go陣列
- Go語言中 defer 使用場景及注意事項,你是要注意的!Go
- Go 語言中,有時 nil 並不是一個 nilGo
- Go 語言中的 collect 使用Go
- Go 語言中使用 ETCDGo
- GO 中的 defer 有哪些注意事項?上Go
- Go語言中用於錯誤處理的Defer、Panic和Recover - Sachin KarveGo
- Go語言中時間輪的實現Go
- Go 語言中的方法Go
- python語言中基本資料型別有哪些?Python資料型別
- 在嵌入式C語言中使用結構的方法有哪些C語言
- 在 Go 語言中,我為什麼使用介面Go
- Go語言中切片slice的宣告與使用Go
- 在Go語言中,怎樣使用Json的方法?GoJSON
- Go 語言中的 切片 --sliceGo
- Go 語言中的外掛Go
- GO語言————6.4 defer 和追蹤Go
- go語言有哪些優勢Go
- GO 語言中的物件導向Go物件
- Go 語言中 strings 包常用方法Go
- Go語言中的併發模式Go模式
- go語言中變數前加 *和& 有啥區別啊Go變數
- go語言開發有哪些工具Go
- go語言中make和new有什麼作用以及區別?Go
- Go語言中的變數作用域Go變數
- Go語言中的單元測試Go
- 認識 Go 語言中的陣列Go陣列
- Python語言中變數名是什麼?命名規則有哪些?Python變數
- 2. Go中defer使用注意事項Go
- Go 語言中的兩種 slice 表示式Go
- go語言中import不允許迴圈包含GoImport
- 9.Go語言中的流程控制Go
- Go 語言中的格式化輸出Go
- Go語言中mysql資料庫操作(一)GoMySql資料庫
- 詳細解讀go語言中的chnanelGoNaN
- 聊聊Go語言中的陣列與切片Go陣列
- hash 表在 go 語言中的實現Go