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
【勵志篇】:
古之成大事掌大學問者,不惟有超世之才,亦必有堅韌不拔之志。
總結
- 上一篇: PythonOpencv-分类器—SVM
- 下一篇: 组装自己的tesla超级计算机