新聞中心
01 、介紹
defer 的使用方式是在其后緊跟一個(gè)函數(shù)調(diào)用或方法調(diào)用,確保在其所在的函數(shù)體返回之前執(zhí)行其調(diào)用的函數(shù)或方法。

創(chuàng)新互聯(lián)企業(yè)建站,10年網(wǎng)站建設(shè)經(jīng)驗(yàn),專注于網(wǎng)站建設(shè)技術(shù),精于網(wǎng)頁(yè)設(shè)計(jì),有多年建站和網(wǎng)站代運(yùn)營(yíng)經(jīng)驗(yàn),設(shè)計(jì)師為客戶打造網(wǎng)絡(luò)企業(yè)風(fēng)格,提供周到的建站售前咨詢和貼心的售后服務(wù)。對(duì)于成都網(wǎng)站制作、成都做網(wǎng)站、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)中不同領(lǐng)域進(jìn)行深入了解和探索,創(chuàng)新互聯(lián)在網(wǎng)站建設(shè)中充分了解客戶行業(yè)的需求,以靈動(dòng)的思維在網(wǎng)頁(yè)中充分展現(xiàn),通過對(duì)客戶行業(yè)精準(zhǔn)市場(chǎng)調(diào)研,為客戶提供的解決方案。
在 Go 語(yǔ)言中,defer 一般用于資源釋放,或使用 defer 調(diào)用一個(gè)匿名函數(shù),在匿名函數(shù)中使用 recover() 處理異常 panic。
在使用 defer 時(shí),也很容易遇到陷阱,本文我們介紹使用 defer 時(shí)有哪些陷阱。
02、 defer 陷阱
defer 語(yǔ)句不可以在 return 語(yǔ)句之后。
示例代碼:
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
}輸出結(jié)果:
name:phper閱讀上面這段代碼,我們?cè)?nbsp;return 語(yǔ)句之后執(zhí)行 defer 語(yǔ)句,通過輸出結(jié)果可以發(fā)現(xiàn) defer 語(yǔ)句調(diào)用未執(zhí)行。
雖然 defer 可以在函數(shù)體中的任意位置,我們也是需要特別注意使用 defer 的位置是否可以執(zhí)行。
defer 語(yǔ)句執(zhí)行匿名函數(shù),參數(shù)預(yù)處理。
示例代碼:
func main() {
var count int64
defer func(data int64) {
fmt.Println("defer:", data)
}(count + 1)
count = 100
fmt.Println("main:", count)
}輸出結(jié)果:
main: 100
defer: 1閱讀上面這段代碼,首先我們定義一個(gè)類型為 int64 的變量 count,然后使用 defer 語(yǔ)句執(zhí)行一個(gè)匿名函數(shù),匿名函數(shù)傳遞參數(shù)為 count + 1,最終 main 函數(shù)輸出 100,defer 執(zhí)行的匿名函數(shù)輸出 1。
因?yàn)樵趫?zhí)行 defer 語(yǔ)句時(shí),執(zhí)行了 count + 1,并先將其存儲(chǔ),等到 defer 所在的函數(shù)體 main 執(zhí)行完,再執(zhí)行 defer 語(yǔ)句調(diào)用的匿名函數(shù)的函數(shù)體中的代碼。
03 、總結(jié)
本文主要介紹在使用 defer 語(yǔ)句時(shí)可能會(huì)遇到的陷阱。分別是 defer 語(yǔ)句不可以在 return 語(yǔ)句之后;defer 語(yǔ)句執(zhí)行的匿名函數(shù),匿名函數(shù)的參數(shù)會(huì)被預(yù)先處理。
讀者朋友們?cè)谑褂?Go 語(yǔ)言的 defer 語(yǔ)句時(shí),還遇到過哪些陷阱?
文章題目:Go語(yǔ)言中defer使用時(shí)有哪些陷阱?
文章網(wǎng)址:http://m.5511xx.com/article/dpjihcd.html


咨詢
建站咨詢
