GO 中的 defer 有哪些注意事項(xiàng)?上
xdm , 不知道你們是否有使用過 defer ?,這種語法在是 go 特有的,用起來真是爽的不要不要的
很多時(shí)候,我們?cè)谑褂靡恍┬聳|西,出現(xiàn)一些莫名其妙的現(xiàn)象或者是結(jié)果的時(shí)候,我們總會(huì)認(rèn)為,這個(gè)東西不友好, 這個(gè)東西好坑,好奇怪
其實(shí)我們是要弄明白其中的注意點(diǎn),原理,當(dāng)出現(xiàn)所謂的奇怪現(xiàn)象的時(shí)候,處理起來就會(huì)得心應(yīng)手得多
xdm,這里準(zhǔn)備了如下注意事項(xiàng),請(qǐng)查收
案例 1
這里先統(tǒng)一說明一下 defer 是干什么的?
是 GO 中的一個(gè)關(guān)鍵字
這個(gè)關(guān)鍵字,我們一般用在釋放資源,在 return
前會(huì)調(diào)用他
如果程序中有多個(gè) defer
,defer 的調(diào)用順序是按照類似棧的方式,后進(jìn)先出 LIFO
的 , 具體的 defer 實(shí)現(xiàn)原理可以查看我的歷史文章 ? GO 中 defer的實(shí)現(xiàn)原理
先來看一個(gè) demo,猜一猜他的輸出是什么?
寫一個(gè) defer 和 defer 在一起的 輸入輸出順序 demo
簡單寫 4 個(gè)函數(shù),分別應(yīng)用到 defer 上
func?test1()?{
?fmt.Println("test?1")
}
func?test2()?{
?fmt.Println("test?2")
}
func?test3()?{
?fmt.Println("test?3")
}
func?test4()?{
?fmt.Println("test?4")
}
func?main()?{
?defer?test1()
?defer?test2()
?defer?test3()
?defer?test4()
}
運(yùn)行上述代碼,我們期望的結(jié)果是什么呢?
test?1
test?2
test?3
test?4
還是
test?4
test?3
test?2
test?1
小伙伴們感興趣的可以運(yùn)行一下,結(jié)果是 第二種,defer 我們可以理解為是一個(gè)入棧操作,先進(jìn)后出
入棧 : test1(),test2(),test3(),test4()
出棧 : test4(),test3(),test2(),test1()
案例 2
上面我們知道 defer 和 defer 的順序是按照棧的順序來,那么我們下面來看看 defer ?和 return 的順序又是什么樣子的 ?
簡單寫 一個(gè)用于 return 的函數(shù)和 用于 defer 的函數(shù)
func?testDefer()?{
?fmt.Println("testDefer")
}
func?testReturn()?int?{
?fmt.Println("testReturn")
?return?1
}
func?myTest()?int?{
?defer?testDefer()
?return?testReturn()
}
func?main()?{
?myTest()
}
再來猜測(cè)一下上述編碼會(huì)是如何執(zhí)行的呢
是這樣的嗎?
testDefer
testReturn
還是這樣的 ?
testReturn
testDefer
結(jié)果仍然是第二種,通過上述編碼我們可以看出來 defer 后面的語句 是晚執(zhí)行的, return 后面的語句是先執(zhí)行的
那么如果是 多個(gè) defer 和 return 放在一起呢?
xdm ,咱們舉一反三了,那肯定還是 return 先執(zhí)行,defer 按照棧的順序執(zhí)行
案例 3
這個(gè)案例咱們加上簡單的計(jì)算,看看效果如何
簡單些一下帶有計(jì)算的 defer
func?testDefer(num?int)(res?int){
?defer?func(){
??res?=?num?+?3
?}()
?return?num
}
func?main(){
?res?:=?testDefer(5)
?fmt.Println(res)
}
上述編碼運(yùn)行后會(huì)是什么效果呢
是 5 嗎? 是 8 嗎?反正肯定不是 3 吧
思考一下,按照上面案例 1 的邏輯,結(jié)果是 8
老鐵,沒毛病, num 通過 ?testDefer 函數(shù)傳值,賦值 為 5 ,return num
的時(shí)候,返回值是 ?5,再執(zhí)行 defer 語句, 5+3 就是 8
好了,今天就到這里,感興趣的朋友也可以玩起來
歡迎點(diǎn)贊,關(guān)注,收藏
朋友們,你的支持和鼓勵(lì),是我堅(jiān)持分享,提高質(zhì)量的動(dòng)力

好了,本次就到這里
技術(shù)是開放的,我們的心態(tài),更應(yīng)是開放的。擁抱變化,向陽而生,努力向前行。
我是阿兵云原生,歡迎點(diǎn)贊關(guān)注收藏,下次見~