日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

golang中defer语句使用小结

發布時間:2025/3/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 golang中defer语句使用小结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

defer是Go語言中的延遲執行語句,用來添加函數結束時執行的代碼,常用于釋放某些已分配的資源、關閉數據庫連接、斷開socket連接、解鎖一個加鎖的資源。Go語言機制擔保一定會執行defer語句中的代碼。其它語言中也有類似的機制,比如Java、C#語言里的finally語句,C++語言里的析構函數(Destructor)可以起類似的作用,C++語言機制擔保在對象被銷毀前一定會執行析構函數中的代碼。C++中的析構函數析構的是對象,Go中的defer析構的是函數。

一、defer語句執行時機

defer語句在函數返回之前 或者 函數中 return語句(return語句可能調用另一個函數) 之后執行。示例代碼:

package mainimport ("fmt" )func main() {fmt.Println(deferReturn()) }func deferReturn() (ret int) {defer func() {ret++}()return 10 }

上述代碼打印出來的值是:11。?defer語句 匿名函數中的“ret++” 對返回值 10 加 1 變成了 11。再來看一個defer語句出現在return語句之后的代碼:

func returnDefer() (ret int) {return 0defer func() {ret++ret++}()return 1 }

上述returnDefer函數的返回值是:0。原因是defer語句還沒有添加上代碼執行到"return 0"函數就返回了,因此defer語句就沒有執行。

二、多個defer語句的執行順序是逆序執行

當出現多條 defer 語句時以逆序執行(類似棧,即后進先出)。示例代碼:

func deferSample() {for i := 0; i < 5; i++ {defer fmt.Printf("%d ", i)} }

上述代碼將會輸出:4 3 2 1 0

三、defer與panic

1、在panic語句后面的defer語句不被執行

示例代碼:

func panicDefer() {panic("panic")defer fmt.Println("defer after panic") }

上述代碼的輸出如下:

panic: panic

goroutine 1 [running]:
main.panicDefer()
??? E:/godemo/testdefer.go:17 +0x39
main.main()
??? E:/godemo/testdefer.go:13 +0x20

Process finished with exit code 2

可以看到 defer 語句沒有執行。

2、在panic語句前的defer語句會被執行

示例代碼:

func deferPanic() {defer fmt.Println("defer before panic")panic("panic") }

上述代碼的輸出如下:

defer before panic
panic: panic

goroutine 1 [running]:
main.deferPanic()
??? E:/godemo/testdefer.go:19 +0x95
main.main()
??? E:/godemo/testdefer.go:14 +0x20

Process finished with exit code 2

defer 語句輸出了內容。

Go中的panic類似其它語言中的拋出異常,panic后面的代碼不再執行(panic語句前面的defer語句會被執行)。

四、return 的實現邏輯

1、第一步給返回值賦值(若是有名返回值直接賦值,匿名返回值 則 先聲明再 賦值) ;
2、第二步調用RET返回指令并傳入返回值,RET會檢查是否存在defer語句,若存 在就先逆序插播 defer語句 ;
3、最后 RET 攜帶返回值退出函數 。

可以看出 , return 不是一個原子操作,函數返回值與 RET 返回值并不一定一致。

五、defer、 return、返回值三者順序

defer、 return、返回值 三者的執行順序是 : return 最先給返回值賦值;接著 defer 開始執行一些收尾工作;最后 RET 指令攜帶返回值退出函數。

總結

以上是生活随笔為你收集整理的golang中defer语句使用小结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 成人美女毛片 | 中文字幕五码 | 日韩av一区在线 | 在线国产日韩 | 蜜桃99视频一区二区三区 | 理论视频在线观看 | 亚洲精品久久久久久 | 老头老太做爰xxx视频 | 操三八男人的天堂 | 日韩精品一区二区视频 | 最近中文字幕av | 米奇影视第四色 | 美女狂揉羞羞的视频 | 久久精品视频7 | 国产成人久久精品77777综合 | 欧美性生交片4 | 国产人妖视频 | 日本伦理一区二区三区 | 蜜臀av一区二区三区有限公司 | 国产亚洲自拍一区 | 91精品黄色 | 天降女子在线观看 | 粗喘呻吟撞击猛烈疯狂 | 欧美老熟妇乱xxxxx | 无遮挡av| 国产一级片精品 | 日韩va亚洲va欧美va久久 | 激情五月婷婷 | 久久成人精品一区二区 | av黄色网| 爱爱一级 | 日韩最新在线 | 国产麻豆午夜三级精品 | 蜜臀网在线 | 亚洲黄色小视频 | 国产美女久久久 | sese久久| 中日韩欧美在线观看 | 黄色片网站视频 | 日本伊人网 | 久草综合网 | www天天操| 在线免费观看一区二区三区 | 欧美日韩中出 | 国产成人午夜精品无码区久久 | 伊人久久色 | 在线观看国产精品入口男同 | 免费看的av片 | 天堂国产| 一二三毛片 | 国产97色在线 | 国产 | 亚洲第一精品网站 | 午夜影视在线观看 | 色香天天 | 精品一区二区三区欧美 | 日韩黄视频 | 成人免费毛片xxx | 污视频在线观看免费 | 国产精品推荐 | 亚洲欧美另类在线 | 日韩二区视频 | 激情婷婷综合网 | 欧美午夜精品一区二区三区 | 人人色网 | 国产精品夜色一区二区三区 | 久久99精品久久久久 | 国产观看 | 中国一级特黄真人毛片免费观看 | 在线成人观看 | 色呦呦视频在线 | 人禽l交视频在线播放 视频 | 日韩精品人妻一区 | 女人喂男人奶水做爰视频 | 国产精品偷伦视频免费看 | 免费观看黄色网页 | 国产区一二 | 中文字幕乱码人妻无码久久95 | 欧美一级黄色网 | 亚洲综合激情小说 | 黄色片xxx| 黄色一级免费观看 | 久久精品波多野结衣 | 久久精品爱 | 欧美激情三级 | 亚洲爱爱网 | 日本久久中文字幕 | 美女被草网站 | 91精品国产综合久久精品图片 | 丁香七月婷婷 | 台湾佬综合网 | 亚洲天堂二区 | 亚洲欧洲一区二区在线观看 | 日本高清免费aaaaa大片视频 | 天堂俺去俺来也www久久婷婷 | 国产精品666 | 欧美福利视频一区 | 天天色官网 | 美女被c出白浆 | 中国肥胖女人真人毛片 |