日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

关键字之defer、panic、recover

發(fā)布時間:2025/3/16 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关键字之defer、panic、recover 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、defer? ?? ?

?????????1、?defer延遲調(diào)用,完成一些收尾工作。無論函數(shù)或方法是否出錯,一定會在退出當前函數(shù)或者方法之前調(diào)用傳入的函數(shù)(只對函數(shù)或方法生效,代碼塊不生效),常被用于關(guān)閉文件描述符、關(guān)閉數(shù)據(jù)庫連接以及解鎖資源。

? ? ? ? 2、defer的實現(xiàn)原理

????????編譯器會將?defer?關(guān)鍵字都轉(zhuǎn)換成?runtime.deferproc?函數(shù),負責創(chuàng)建新的延遲調(diào)用;runtime.deferreturn?函數(shù)負責在函數(shù)調(diào)用結(jié)束時執(zhí)行所有的延遲調(diào)用,runtime.deferreturn?函數(shù)會多次判斷當前 Goroutine 的?_defer?鏈表中是否有未執(zhí)行的剩余結(jié)構(gòu),在所有的延遲函數(shù)調(diào)用都執(zhí)行完成之后,該函數(shù)才會返回。

? ? ? ? 3、多次調(diào)用 defer 時的執(zhí)行順序問題:

? ? ? ? 后調(diào)用的defer函數(shù)會先執(zhí)行,先調(diào)用的defer函數(shù)會后執(zhí)行。內(nèi)部其實是一個defer鏈表,會綁定到當前的goroutine

? ?defer?關(guān)鍵字插入時是從后向前的,而?defer?關(guān)鍵字執(zhí)行是從前向后的,而這就是后調(diào)用的?defer?會優(yōu)先執(zhí)行的原因。


? ? ? ?4、 defer的傳值方式及預(yù)計算問題:
????????defer的傳值采用值傳遞,調(diào)用defer時會立刻對函數(shù)中引用的外部參數(shù)進行拷貝進行值傳遞,導致實際執(zhí)行時。

func main() {startedAt := time.Now()defer fmt.Println(time.Since(startedAt))time.Sleep(time.Second) }


????????解決此問題可以向 defer 關(guān)鍵字傳入匿名函數(shù),雖然調(diào)用defer時也使用值傳遞,但是因為拷貝的是函數(shù)指針,所以 time.Since(startedAt) 會在 main 函數(shù)返回前被調(diào)用并打印出符合預(yù)期的結(jié)果。

func main() {startedAt := time.Now()defer func() { fmt.Println(time.Since(startedAt)) }()time.Sleep(time.Second) }

二、panic和recover

panic,調(diào)用panic時會立刻停止執(zhí)行函數(shù)的其他代碼,并觸發(fā)當前Goroutine的defer鏈表(defer要定義在panic之前,否則defer不生效);
recover,可以中止panic造成的程序崩潰,且只能定義在defer中。

觸發(fā)panic時,會先打印defer的函數(shù)再打印異常堆棧信息

package main import "fmt" func main() { defer func() { fmt.Println("a")}() defer func() { fmt.Println("b")}() defer func() { fmt.Println("c")}() panic("error") }打印: GOROOT=D:\Go #gosetup GOPATH=D:\goland\workspace #gosetup D:\Go\bin\go.exe build -o C:\Users\80310624\AppData\Local\Temp\___1go_build_main_go.exe D:\goland\workspace\src\proj_test01\main.go #gosetup C:\Users\80310624\AppData\Local\Temp\___1go_build_main_go.exe #gosetup c b a panic: errorgoroutine 1 [running]: main.main()D:/goland/workspace/src/proj_test01/main.go:15 +0x85Process finished with exit code 2

總結(jié)

以上是生活随笔為你收集整理的关键字之defer、panic、recover的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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