最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

GO 中的 defer 有哪些注意事項(xiàng)?上

2023-02-23 22:37 作者:阿兵云原生  | 我要投稿

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)注收藏,下次見~


GO 中的 defer 有哪些注意事項(xiàng)?上的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
乐平市| 延长县| 灌云县| 策勒县| 辽源市| 治县。| 玉门市| 乃东县| 隆林| 邯郸县| 新郑市| 额尔古纳市| 汶上县| 上虞市| 尚义县| 基隆市| 安顺市| 徐汇区| 延津县| 呼和浩特市| 南华县| 合水县| 江城| 高雄县| 黄骅市| 任丘市| 昭觉县| 泾川县| 华亭县| 巴塘县| 威远县| 河间市| 同江市| 酒泉市| 牟定县| 济源市| 绥芬河市| 本溪| 商河县| 民县| 罗田县|