亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Golang > 正文

golang中defer的關鍵特性示例詳解

2020-04-01 19:04:21
字體:
來源:轉載
供稿:網友

前言

大家都知道golang/196398.html">golangdefer關鍵字,它可以在函數返回前執行一些操作,最常用的就是打開一個資源(例如一個文件、數據庫連接等)時就用defer延遲關閉改資源,以免引起內存泄漏。本文主要給大家介紹了關于golang中defer的關鍵特性,分享出來供大家參考學習,下面話不多說,來一起看看詳細的介紹:

一、defer 的作用和執行時機

go 的 defer 語句是用來延遲執行函數的,而且延遲發生在調用函數 return 之后,比如

func a() int { defer b() return 0}

b 的執行是發生在 return 0 之后,注意 defer 的語法,關鍵字 defer 之后是函數的調用。

二、defer 的重要用途一:清理釋放資源

由于 defer 的延遲特性,defer 常用在函數調用結束之后清理相關的資源,比如

f, _ := os.Open(filename)defer f.Close()

文件資源的釋放會在函數調用結束之后借助 defer 自動執行,不需要時刻記住哪里的資源需要釋放,打開和釋放必須相對應。

用一個例子深刻詮釋一下 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 { //1  return } written, err = io.Copy(dst, src) dst.Close() src.Close() return}

代碼在 #1 處返回之后,src 文件沒有執行關閉操作,可能會導致資源不能正確釋放,改用 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)}

src 和 dst 都能及時清理和釋放,無論 return 在什么地方執行。

鑒于 defer 的這種作用,defer 常用來釋放數據庫連接,文件打開句柄等釋放資源的操作。

三、defer 的重要用途二:執行 recover

被 defer 的函數在 return 之后執行,這個時機點正好可以捕獲函數拋出的 panic,因而 defer 的另一個重要用途就是執行 recover。

recover 只有在 defer 中使用才更有意義,如果在其他地方使用,由于 program 已經調用結束而提前返回而無法有效捕捉錯誤。

package mainimport ( "fmt")func main() { defer func() {  if ok := recover(); ok != nil {   fmt.Println("recover")  } }() panic("error")}

記住 defer 要放在 panic 執行之前。

四、多個 defer 的執行順序

defer 的作用就是把關鍵字之后的函數執行壓入一個棧中延遲執行,多個 defer 的執行順序是后進先出 LIFO :

defer func() { fmt.Println("1") }()defer func() { fmt.Println("2") }()defer func() { fmt.Println("3") }()

輸出順序是 321。

這個特性可以對一個 array 實現逆序操作。

五、被 deferred 函數的參數在 defer 時確定

這是 defer 的特點,一個函數被 defer 時,它的參數在 defer 時進行計算確定,即使 defer 之后參數發生修改,對已經 defer 的函數沒有影響,什么意思?看例子:

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

a 執行輸出的是 0 而不是 1,因為 defer 時,i 的值是 0,此時被 defer 的函數參數已經進行執行計算并確定了。

再看一個例子:

func calc(index string, a, b int) int { ret := a + b fmt.Println(index, a, b, ret) return ret}func main() { a := 1 b := 2 defer calc("1", a, calc("10", a, b)) a = 0 return}

執行代碼輸出

10 1 2 3 1 1 3 4

defer 函數的參數 第三個參數在 defer 時就已經計算完成并確定,第二個參數 a 也是如此,無論之后 a 變量是否修改都不影響。

六、被 defer 的函數可以讀取和修改帶名稱的返回值

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

被 defer 的函數是在 return 之后執行,可以修改帶名稱的返回值,上面的函數 c 返回的是 2。

總結

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

參考資料

https://blog.golang.org/defer-panic-and-recover

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧日韩不卡在线视频| 国产精品久久久久久久久粉嫩av| 俺也去精品视频在线观看| 久久久精品中文字幕| 国产一区红桃视频| 亚洲精品一区在线观看香蕉| 国内外成人免费激情在线视频网站| 国a精品视频大全| 久久亚洲综合国产精品99麻豆精品福利| 中文字幕精品影院| 中文字幕日韩av| 91精品国产综合久久香蕉922| 国产成人啪精品视频免费网| 国产精品女视频| xxxx性欧美| 成人中文字幕+乱码+中文字幕| 2018日韩中文字幕| 久久男人av资源网站| 成人做爰www免费看视频网站| 欧美日韩中文字幕在线视频| 26uuu另类亚洲欧美日本老年| 亚洲精品日韩久久久| 欧美电影在线观看| 高跟丝袜一区二区三区| 日韩视频免费观看| 国产一区二区三区高清在线观看| 自拍偷拍亚洲精品| 17婷婷久久www| 国产福利成人在线| 亚洲男人天堂2023| 欧美日韩亚洲网| 日韩精品久久久久久福利| 国产成人久久久| 久久精品在线播放| 精品伊人久久97| 亚洲一区二区免费在线| 国产精品丝袜久久久久久高清| 国产a级全部精品| 国产一区二区三区18| 欧美日韩在线观看视频小说| 色777狠狠综合秋免鲁丝| 国产精品一区二区三| 欧美巨乳在线观看| 日韩在线精品一区| 国产精品中文在线| 精品久久久国产精品999| 成人精品视频久久久久| 精品国产31久久久久久| 日韩不卡在线观看| 久久亚洲私人国产精品va| 国产欧美日韩综合精品| 久久久久久久成人| 国产在线精品成人一区二区三区| 97人洗澡人人免费公开视频碰碰碰| 精品无人区太爽高潮在线播放| 欧美黄色片免费观看| 北条麻妃在线一区二区| 久久69精品久久久久久国产越南| 国产亚洲免费的视频看| 91精品国产自产在线观看永久| 91久久精品国产91性色| 国产精品美女免费视频| 亚洲自拍av在线| 伊人精品在线观看| 久久精品视频亚洲| 欧美精品久久久久久久久| 97免费中文视频在线观看| 日韩在线视频线视频免费网站| 亚洲 日韩 国产第一| 在线观看日韩www视频免费| 亚洲精品福利在线| 日本欧美黄网站| 欧美在线免费看| 日韩有码片在线观看| 91在线网站视频| 91豆花精品一区| 久久夜色精品国产欧美乱| 黄色成人av网| 91精品国产91久久久久福利| 欧美日韩一区二区在线播放| 欧美老女人bb| 搡老女人一区二区三区视频tv| 国产在线高清精品| 欧美性感美女h网站在线观看免费| 国产亚洲欧美一区| 日本久久久久久久久| 91av中文字幕| 日本亚洲欧美三级| 国产精品夫妻激情| 狠狠躁18三区二区一区| 久久免费视频网站| 亚洲伊人久久大香线蕉av| 成人在线一区二区| 欧美激情在线有限公司| 日韩欧美中文字幕在线播放| 高潮白浆女日韩av免费看| 亚洲美女精品成人在线视频| 久久99亚洲精品| 欧美午夜激情在线| 日韩福利在线播放| 秋霞成人午夜鲁丝一区二区三区| 欧美精品一本久久男人的天堂| 欧美激情精品久久久久久免费印度| 精品日韩中文字幕| 国产日韩精品综合网站| 欧美性受xxx| 国产成人福利视频| 成人性教育视频在线观看| 欧美激情18p| 国产精品久久久久9999| 一本色道久久综合亚洲精品小说| 疯狂欧美牲乱大交777| 精品国产一区二区三区久久狼黑人| 911国产网站尤物在线观看| 国内精品模特av私拍在线观看| 奇米4444一区二区三区| 国产精品日韩在线播放| 欧美视频中文在线看| 91精品国产高清自在线| 国产黑人绿帽在线第一区| 日韩在线视频国产| 国产精品老女人精品视频| 亚洲欧美日韩国产成人| 久久久久久久久久久91| 日韩精品免费在线视频观看| 久久久久亚洲精品国产| 不卡毛片在线看| 欧美极品少妇xxxxⅹ免费视频| 欧美激情中文字幕在线| 日韩视频中文字幕| 色婷婷综合久久久久中文字幕1| 欧美日韩国产精品一区二区三区四区| 中文亚洲视频在线| 成人午夜黄色影院| 国产精品视频一| 日韩成人黄色av| 亚洲天堂av在线免费观看| 国产精品手机播放| 欧美精品videossex88| 亚洲第一网站男人都懂| 国产日韩在线看| 欧美一级bbbbb性bbbb喷潮片| 欧美另类99xxxxx| 亚洲网站在线看| 最新中文字幕亚洲| 欧美肥老太性生活视频| 成人亲热视频网站| 成人激情在线播放| 亚洲免费人成在线视频观看| 久久精品中文字幕电影| 欧美日韩午夜视频在线观看| 亚洲网站在线观看| 日韩美女福利视频| 久久久久久久久91| 欧美成人免费va影院高清| 欧美黄色www| 欧美激情欧美激情| 97av在线播放| 欧美激情二区三区| 国语自产精品视频在线看一大j8| 精品毛片三在线观看| 欧美二区在线播放| 日本一本a高清免费不卡| 疯狂欧美牲乱大交777|