婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > golang中defer的使用規則詳解

golang中defer的使用規則詳解

熱門標簽:釘釘有地圖標注功能嗎 汕頭小型外呼系統 阿里云ai電話機器人 惠州電銷防封電話卡 浙江高頻外呼系統多少錢一個月 黃岡人工智能電銷機器人哪個好 建造者2地圖標注 濱州自動電銷機器人排名 鄭州亮點科技用的什么外呼系統

前言

在golang當中,defer代碼塊會在函數調用鏈表中增加一個函數調用。這個函數調用不是普通的函數調用,而是會在函數正常返回,也就是return之后添加一個函數調用。因此,defer通常用來釋放函數內部變量。

為了更好的學習defer的行為,我們首先來看下面一段代碼:

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 
}

written, err = io.Copy(dst, src) 
dst.Close() 
src.Close() 
return 
}

這段代碼可以運行,但存在'安全隱患'。如果調用dst, err := os.Create(dstName)失敗,則函數會執行return退出運行。但之前創建的src(文件句柄)沒有被釋放。 上面這段代碼很簡單,所以我們可以一眼看出存在文件未被釋放的問題。 如果我們的邏輯復雜或者代碼調用過多時,這樣的錯誤未必會被及時發現。 而使用defer則可以避免這種情況的發生,下面是使用defer的代碼:

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

dst, err := os.Create(dstName) 
if err != nil { 
return 
}
defer dst.Close()

return io.Copy(dst, src) 
}

通過defer,我們可以在代碼中優雅的關閉/清理代碼中所使用的變量。defer作為golang清理變量的特性,有其獨有且明確的行為。以下是defer三條使用規則。

規則一 當defer被聲明時,其參數就會被實時解析

我們通過以下代碼來解釋這條規則:

func a() { 
i := 0 
defer fmt.Println(i) 
i++ 
return 
}

上面我們說過,defer函數會在return之后被調用。那么這段函數執行完之后,是不用應該輸出1呢?

讀者自行編譯看一下,結果輸出的是0. why?

這是因為雖然我們在defer后面定義的是一個帶變量的函數: fmt.Println(i) . 但這個變量(i)在defer被聲明的時候,就已經確定其確定的值了。 換言之,上面的代碼等同于下面的代碼:

func a() { 
i := 0 
defer fmt.Println(0) //因為i=0,所以此時就明確告訴golang在程序退出時,執行輸出0的操作 
i++ 
return 
}

為了更為明確的說明這個問題,我們繼續定義一個defer:

func a() { 
i := 0 
defer fmt.Println(i) //輸出0,因為i此時就是0 
i++ 
defer fmt.Println(i) //輸出1,因為i此時就是1 
return 
}

通過運行結果,可以看到defer輸出的值,就是定義時的值。而不是defer真正執行時的變量值(很重要,搞不清楚的話就會產生于預期不一致的結果)

但為什么是先輸出1,在輸出0呢? 看下面的規則二。

規則二 defer執行順序為先進后出

當同時定義了多個defer代碼塊時,golang安裝先定義后執行的順序依次調用defer。不要為什么,golang就是這么定義的。我們用下面的代碼加深記憶和理解:

func b() { 
for i := 0; i  4; i++ { 
defer fmt.Print(i) 
}
}

在循環中,依次定義了四個defer代碼塊。結合規則一,我們可以明確得知每個defer代碼塊應該輸出什么值。 安裝先進后出的原則,我們可以看到依次輸出了3210.

規則三 defer可以讀取有名返回值

先看下面的代碼:

func c() (i int) { 
defer func() { i++ }() 
return 1 
}

輸出結果是12. 在開頭的時候,我們說過defer是在return調用之后才執行的。 這里需要明確的是defer代碼塊的作用域仍然在函數之內,結合上面的函數也就是說,defer的作用域仍然在c函數之內。因此defer仍然可以讀取c函數內的變量(如果無法讀取函數內變量,那又如何進行變量清除呢....)。

當執行return 1 之后,i的值就是1. 此時此刻,defer代碼塊開始執行,對i進行自增操作。 因此輸出2.

掌握了defer以上三條使用規則,那么當我們遇到defer代碼塊時,就可以明確得知defer的預期結果。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • Golang之defer 延遲調用操作
  • 聊聊golang的defer的使用
  • Golang學習筆記之延遲函數(defer)的使用小結
  • golang中defer的關鍵特性示例詳解
  • Golang巧用defer進行錯誤處理的方法
  • Golang 的defer執行規則說明

標簽:東營 駐馬店 晉中 阿壩 瀘州 滄州 泰安 昭通

巨人網絡通訊聲明:本文標題《golang中defer的使用規則詳解》,本文關鍵詞  golang,中,defer,的,使用,規則,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《golang中defer的使用規則詳解》相關的同類信息!
  • 本頁收集關于golang中defer的使用規則詳解的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    日韩av中文字幕一区二区| 欧美精品一区二区不卡| 国产69精品久久99不卡| 精品噜噜噜噜久久久久久久久试看| 日韩黄色小视频| 欧美日韩亚洲综合一区二区三区 | 亚洲人成7777| 精品亚洲成av人在线观看| 日韩视频免费观看高清在线视频| 蜜乳av一区二区| 另类的小说在线视频另类成人小视频在线| 一区二区三区.www| 亚洲另类在线视频| 一区二区理论电影在线观看| 国产精品久久网站| 欧美三级三级三级爽爽爽| 国产一区 二区 三区一级| 精品在线观看视频| 另类小说图片综合网| 成人av影院在线| 色婷婷激情综合| av在线播放成人| 国产成人精品一区二区三区四区| 色天天综合久久久久综合片| hitomi一区二区三区精品| 日韩一区二区三区在线视频| 91精品国产全国免费观看| 成人美女在线视频| 亚洲福中文字幕伊人影院| 在线观看日产精品| 国产精品自拍一区| 国产一区二区看久久| 成人app网站| 在线播放中文字幕一区| 久久久久久久久久电影| 免费人成在线不卡| 国产日产亚洲精品系列| 亚洲欧美日本在线| 日韩三级av在线播放| 欧美午夜理伦三级在线观看| 91亚洲精品一区二区乱码| 国产99久久久精品| 国产精品少妇自拍| 国产成人综合亚洲91猫咪| 国产精品白丝jk黑袜喷水| 91亚洲国产成人精品一区二区三| 91精品国产综合久久福利软件| 成人美女视频在线看| 欧美美女一区二区三区| 一本大道av伊人久久综合| 国产米奇在线777精品观看| 日本女优在线视频一区二区 | 日韩理论片在线| 视频一区视频二区中文| 在线免费av一区| 日本电影亚洲天堂一区| 欧美在线你懂得| 91高清在线观看| 精品黑人一区二区三区久久| 亚洲一区二区三区四区在线免费观看| 亚洲乱码精品一二三四区日韩在线| 高清在线观看日韩| 三级影片在线观看欧美日韩一区二区| 粉嫩蜜臀av国产精品网站| 久久91精品久久久久久秒播| 91精品国产综合久久久蜜臀图片 | 成人黄色国产精品网站大全在线免费观看 | www.欧美精品一二区| 国产精品欧美一区喷水| 欧美日韩中文精品| 蜜臀91精品一区二区三区| 欧美日韩日日夜夜| 91精品国产91久久综合桃花| 日本一区二区三区在线不卡| 亚洲国产精品久久久久秋霞影院| 亚洲国产欧美一区二区三区丁香婷| 91国偷自产一区二区三区观看| 午夜亚洲国产au精品一区二区| 国产剧情一区二区| 亚洲一区二区三区在线播放| 中文字幕免费观看一区| 亚洲国产综合色| 日本特黄久久久高潮| 精品少妇一区二区三区| 亚洲精品v日韩精品| 国产高清不卡二三区| 日韩精品亚洲专区| 欧美肥大bbwbbw高潮| 国产精品一区专区| 免费欧美日韩国产三级电影| 国产亚洲综合av| 9191久久久久久久久久久| 国产米奇在线777精品观看| 婷婷六月综合网| 日韩三级av在线播放| 午夜欧美视频在线观看| 欧美图区在线视频| 日韩精品一区二区三区四区| 国产成人亚洲精品狼色在线| 国产精品色在线| 欧美成va人片在线观看| 日韩一区二区在线免费观看| 国产成人午夜精品5599| 亚洲男人电影天堂| 视频一区中文字幕| 成人免费一区二区三区视频| 懂色av一区二区三区蜜臀| 日本v片在线高清不卡在线观看| 欧美精品粉嫩高潮一区二区| 色婷婷国产精品| 久久99精品久久久| 福利视频网站一区二区三区| 欧美综合一区二区| 国产高清在线精品| 亚洲午夜精品久久久久久久久| 精品不卡在线视频| 欧美一区午夜视频在线观看| 欧美一区二区三区思思人| 国产原创一区二区| 久久se这里有精品| 久久精品国产亚洲aⅴ| 欧美大片国产精品| 91麻豆自制传媒国产之光| 在线观看欧美日本| 国产**成人网毛片九色| 色婷婷久久综合| 精品综合久久久久久8888| 国产在线视频精品一区| 99精品欧美一区| 亚洲精品中文在线| 午夜精品久久久久久久99水蜜桃| 亚洲高清视频在线| 蜜臀久久99精品久久久久久9| 免费观看在线色综合| 欧美午夜在线一二页| 日日夜夜一区二区| 国产精品高潮久久久久无| 精品日产卡一卡二卡麻豆| 欧美日韩国产色站一区二区三区| 91丝袜高跟美女视频| 欧美图区在线视频| 亚洲一区视频在线观看视频| 婷婷夜色潮精品综合在线| 国产综合成人久久大片91| 久久精品av麻豆的观看方式| 国产精品99久久久久久久女警| 欧美日韩国产欧美日美国产精品| 在线观看一区日韩| 日本一区二区综合亚洲| 亚洲永久免费视频| av一区二区三区黑人| 日韩一区二区在线播放| 九九视频精品免费| 欧美吞精做爰啪啪高潮| 欧美色网站导航| 一区二区在线观看不卡| 韩国女主播成人在线| 成人激情小说网站| 国产精品女人毛片| 成人av在线一区二区三区| 欧美xxxxx裸体时装秀| 亚洲欧美另类久久久精品| 国产成人在线看| 亚洲综合网站在线观看| 国产精品美女一区二区三区| 日本中文字幕一区二区有限公司| 欧美猛男男办公室激情| 18欧美亚洲精品| 日本va欧美va精品发布| 日韩亚洲欧美综合| 国产精品亚洲第一区在线暖暖韩国| 精品国产乱码久久久久久图片 | 一区二区三区中文在线观看| 国产精华液一区二区三区| 欧美精品久久99| 亚洲在线一区二区三区| 国产女人aaa级久久久级 | 丰满少妇久久久久久久| 亚洲欧洲精品一区二区三区不卡| 欧美日韩成人综合在线一区二区| 亚洲裸体在线观看| 国产91高潮流白浆在线麻豆 | 亚洲综合成人在线视频| www日韩大片| 色综合天天综合网天天狠天天| 欧美一区二区精品在线| 国产综合久久久久久久久久久久| 国产欧美一区二区精品忘忧草 | 欧美国产日韩精品免费观看| 91小视频免费观看| 另类的小说在线视频另类成人小视频在线| 亚洲女同女同女同女同女同69| 91国偷自产一区二区三区成为亚洲经典| 亚洲成av人片在线观看无码| 亚洲欧美日韩电影| 欧美日韩一区在线| 亚洲一区二区三区不卡国产欧美| 91啪九色porn原创视频在线观看| 精品国精品国产| 欧美日韩小视频|