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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Go语言defer详解

發(fā)布時間:2025/3/21 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Go语言defer详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1. 使用defer的優(yōu)勢

defer一般用于資源的釋放和異常的捕捉, 作為Go語言的特性之一.

defer 語句會將其后面跟隨的語句進行延遲處理. 意思就是說 跟在defer后面的語言 將會在程序進行最后的return之后再執(zhí)行.

在 defer 歸屬的函數(shù)即將返回時,將延遲處理的語句按 defer 的逆序進行執(zhí)行,也就是說,先被 defer 的語句最后被執(zhí)行,最后被 defer 的語句,最先被執(zhí)行。

1.1 資源的釋放

一般我們寫讀取文件的代碼如下

func CopyFile(dstName, srcName string) (written int64, err error) {src, err := os.Open(srcName)if err != nil {return}dst, err := os.Create(dstName)if err != nil {return }dst.Close()src.Close()return }

在程序最開始,os.Open及os.Create打開了兩個文件資源描述符,并在最后通過file.Close方法得到釋放,在正常情況下,該程序能正常運行,一旦在dstName文件創(chuàng)建過程中出現(xiàn)錯誤,程序就直接返回,src資源將得不到釋放。因此需要在所有錯誤退出時釋放資源,即修改為如下代碼才能保證其在異常情況下的正確性。

即在每個err里面如果發(fā)生了異常, 要及時關閉src的資源.
這個問題出現(xiàn)在加鎖中也非常常見

l.lock()// 如果下面發(fā)生了異常 // 我們需要在每個err處理塊中都加入l.unlock()來解鎖 // 不然資源就得不到釋放, 就會產(chǎn)生死鎖 if err != nil {l.unlock()return }

但是這樣做未免太麻煩了, defer優(yōu)雅的幫我們解決了這個問題
比如我們可以這樣

src, err := os.Open(srcName)defer src.Close()if err != nil {return}dst, err := os.Create(dstName)defer dst.Close()if err != nil {return }------------------------------------------l.lock()defer l.unlock()......if err != nil {return }......

這樣寫的話, 就不需要在每個異常處理塊中都加上Close() 或者 unlock()語句了

1.2 異常的捕捉

程序在運行時可能在任意的地方發(fā)生panic異常,例如算術除0錯誤、內(nèi)存無效訪問、數(shù)組越界等,這些錯誤會導致程序異常退出。在很多時候,我們希望能夠捕獲這樣的錯誤,同時希望程序能夠繼續(xù)正常執(zhí)行。一些語言采用try…catch語法,當try塊中發(fā)生異常時,可以通過catch塊捕獲。

Go語言使用了特別的方式處理這一問題。defer的特性是無論后續(xù)函數(shù)的執(zhí)行路徑如何以及是否發(fā)生了panic,在函數(shù)結(jié)束后一定會得到執(zhí)行,這為異常捕獲提供了很好的時機。異常捕獲通常結(jié)合recover函數(shù)一起使用。

如上所示,在executePanic函數(shù)中,手動執(zhí)行panic函數(shù)觸發(fā)了異常。當異常觸發(fā)后,函數(shù)仍然會調(diào)用defer中的函數(shù),然后異常退出。輸出如下,表明調(diào)用了defer中的函數(shù),并且main函數(shù)將不能正常運行,程序異常退出打印出棧追蹤信息。

如下所示,當在defer函數(shù)中使用recover進行異常捕獲后,程序?qū)⒉粫惓M顺?#xff0c;并且能夠執(zhí)行正常的函數(shù)流程。如下輸出表明,盡管有panic,main函數(shù)仍然在正常執(zhí)行后退出。

使用了recover函數(shù)后, 程序?qū)⒉粫惓M顺? 仍會正常執(zhí)行

2. 多個defer語句的執(zhí)行順序

當有多個 defer 行為被注冊時,它們會以逆序執(zhí)行(類似棧,即后進先出), 相當于開辟了一個延時調(diào)用棧

func main() {fmt.Println("defer begin")// 將defer放入延遲調(diào)用棧defer fmt.Println(1)defer fmt.Println(2)// 最后一個放入, 位于棧頂, 最先調(diào)用defer fmt.Println(3)fmt.Println("defer end") }

執(zhí)行的結(jié)果就是

// 先打印正常語句 defer begin defer end // 然后按從上到下的順序執(zhí)行defer調(diào)用棧中的語句 3 2 1

總結(jié)

以上是生活随笔為你收集整理的Go语言defer详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: sao虎视频在线精品永久 | xxx色| 99久久婷婷国产综合精品 | 性生生活大片又黄又 | 日韩精品成人无码专区免费 | 国产成a人亚洲精v品在线观看 | 永久毛片| 日本在线视频播放 | 日本一区精品视频 | 精品久久久久一区二区国产 | 国产一区二区三区电影在线观看 | 天天射天天操天天干 | 日本特级黄色大片 | 日韩国产第一页 | 波多野结衣一二区 | 一级少妇女片 | 欧美日韩免费一区二区三区 | aaa色| 小蝌蚪av | av色成人 | 欧美二区三区 | 9191av| 日韩无码专区 | 老牛av一区二区 | 久热精品视频在线播放 | 99久久伊人 | 日本高清免费不卡视频 | 96人xxxxxxxxx69 | 叼嘿视频91| 久久午夜精品人妻一区二区三区 | 欧美日韩一区二区三区四区五区六区 | 一级性生活免费视频 | 亚洲精品男人天堂 | 国产精品久久一区二区三区 | 老鸭窝av在线 | 国产在线日韩 | 久久综合亚洲精品 | 亚洲最大福利 | 欧美福利视频在线观看 | 久久精品8 | 久久综合伊人77777麻豆最新章节 | 国产在线麻豆 | 中文字幕网站在线观看 | 一级做a爰 | 性欧美hd调教 | 天堂一区二区三区四区 | 狠狠干夜夜草 | 成人欧美精品一区二区 | 亚洲第七页 | 国产精品一区二区av白丝下载 | 国产精品久久久久久久久久久不卡 | 人妻无码一区二区三区 | 日日免费视频 | 女性裸体无遮挡胸 | 麻豆成人久久精品一区二区三区 | 中文字幕――色哟哟 | 天天想你在线观看完整版高清 | 四虎库 | 国产青草视频在线观看 | 中文字幕一区二区不卡 | 国产无套精品一区二区 | 波多野结衣亚洲一区 | xxxx少妇| 韩国精品一区 | 日本在线不卡一区二区 | va视频在线观看 | 免费看日韩毛片 | 秘密基地免费观看完整版中文 | 亚洲爱爱网 | 精品国产乱码久久久久久1区二区 | 日本污视频在线观看 | 打开免费观看视频在线播放 | 国产欧美一区二区精品性色 | 奶罩不戴乳罩邻居hd播放 | 国产11页| 热99在线 | 白丝女仆被免费网站 | 中文视频在线观看 | 欧美特黄 | 久操视频在线免费观看 | 亚洲一区二区三区不卡视频 | 国产午夜精品福利视频 | 久久与婷婷 | 精品国产欧美日韩 | 国产欧美三区 | 天天色图片| 打屁股视频网站 | 都市激情 自拍偷拍 | 青青操视频在线观看 | www.午夜| 麻豆视频免费网站 | 婷婷综合一区 | 美丽的姑娘观看在线播放 | 精品乱子伦 | 人人91 | 五月婷婷激情在线 | 亚洲v在线观看 | 精品中文字幕在线播放 | 天天国产视频 |