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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

defer的用法

發布時間:2023/12/31 综合教程 48 生活家
生活随笔 收集整理的這篇文章主要介紹了 defer的用法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

defer的用法

1.清理釋放資源

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

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

2.執行 recover

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

(1.) panic 能夠改變程序的控制流,調用 panic 后會立刻停止執行當前函數的剩余代碼,并在當前 Goroutine 中遞歸執行調用方的 defer

(2.) recover 可以中止 panic 造成的程序崩潰。它是一個只能在 defer 中發揮作用的函數,在其他作用域中調用不會發揮作用;

(3.) panic 只會觸發當前 Goroutine 的 defer;
(4.) recover 只有在 defer 中調用才會生效;
(5.)panic 允許在 defer 中嵌套多次調用;

// 打印堆棧信息
defer func() {
		if err := recover(); err != nil {
			Log.Error("server panic,err:%v", err)
			for i := 0; ; i++ {
				pc, file, line, ok := runtime.Caller(i)
				if !ok {
					break
				}
			Log.Error("server panic,pc:%v
,file:%v
,line:%v
", pc, file, line)
			}
		}
	}()

3.后進先出

多個defer出現的時候,它是一個“棧”的關系,也就是先進后出。一個函數中,寫在前面的defer會比寫在后面的defer調用的晚。

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

// 執行結果:3 2 1

4.修改帶名稱的返回值

return之后的語句先執行,defer后的語句后執行

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

// 返回值:2

參考鏈接

https://draveness.me/golang/docs/part2-foundation/ch05-keyword/golang-panic-recover/

https://juejin.cn/post/6844903936508297223

【勵志篇】:
古之成大事掌大學問者,不惟有超世之才,亦必有堅韌不拔之志。

總結

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

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