Go基礎學習 defer

2021-10-08 20:41:49 字數 2171 閱讀 9702

defer延遲函式總是在異常panic或者正常return前返回;

defer執行順序按照先入後出的原則,即先入棧的最後執行;但是會先把引數壓入棧,具體執行會在函式結束前

當defer函式中存在函式時會先執行裡面的函式;

defer函式呼叫的引數當存在閉包時,會從外面拿取該引數的最新的值;

defer常常與recover一同使用;用來做異常捕捉後的延遲執行;從而將異常給轉換為錯誤error;

看幾個案例:

案例1:

func

main()

/*output:

100defer i=10

*/

用到原則1、2

案例2:

func

calc

(x,y int

)int

func

main()

//output:

//10 20 30

//100 20 120

//100 120 220

//10 30 40

使用到原則1,2,3

案例3:

func

calc

(x,y int

)int

func

main()

(1000

) a=

100}

//閉包的原理:a會從函式外面找最新的那個值,這個區別於main2中的壓棧執行(先將a傳進去,等待執行);

//output:

//100 20 120

//100 120 220

//1000

使用到原則1,2,3,4

案例4:

func

divi

(x,y int

)(z int

,err error)}

()z = x / y

return z ,

nil}

/*input:divi(1,0)

output:

0 runtime error: integer divide by zero

*/

使用到原則1,2,3,5

案例5:

func

main()

func

deferfunc1

(i int

)(t int)(

)return t

}func

deferfunc2

(i int

)int()

return t

}func

deferfunc3

(i int

)(t int)(

)return2}

/*output:

4 1 3

*/

使用到原則1;

此外對於返回值如果在返回引數中宣告了變數,那們他就是全域性的;

按照此原則,deferfunc1;t被全域性宣告,在返回前呼叫defer,返回4;deferfunc2中

t在函式內部宣告,defer相當於閉包呼叫了外面的t,相當於賦值黏貼改的不是指標;所以返回的是1;deferfunc3中t全域性宣告了 ,此外return 2相當於給t賦值為2;之後再呼叫defer,所以返回的是3

案例6:

func

main()

else}(

)defer

func()

)}()

panic

("panic")}

/*-----

++++

0x49abd0 defer panic func

*/

panic僅有最後乙個可以被revover捕獲

觸發panic(「panic」)後順序執行defer,但是defer中還有乙個panic,所以覆蓋了之前的panic(「panic」)

Go語言defer學習小結

延時呼叫函式語法 defer func name param list defer func 關鍵字defer修飾的函式,值得關注的有以下幾點 1 函式會被推遲到包含這個defer語句的函式即將返回前才被呼叫執行。這點需要理解defer的工作機制,大致為defer出現的地方,插入指令call run...

GO學習系列 defer的使用

在學習go的過程中,發現defer的用法,可以延遲返回,即在函式return前會按照逆序依次呼叫defer func 主要使用在函式返回前需要釋放資源時,而函式又有多個return的分支,為了防止忘記釋放資源而導致記憶體洩漏等,使用defer 統一釋放。例如 func a if stateb ret...

go語言 defer 高階

go語言defer語句的用法 defer後面必須是函式呼叫語句,不能是其他語句,否則編譯器會出錯。package main import log func foo n int int func main 這個例子中defer後面使用的是n 指令,不是乙個函式呼叫語句,編譯器就報錯 command l...