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;案例6:此外對於返回值如果在返回引數中宣告了變數,那們他就是全域性的;
按照此原則,deferfunc1;t被全域性宣告,在返回前呼叫defer,返回4;deferfunc2中
t在函式內部宣告,defer相當於閉包呼叫了外面的t,相當於賦值黏貼改的不是指標;所以返回的是1;deferfunc3中t全域性宣告了 ,此外return 2相當於給t賦值為2;之後再呼叫defer,所以返回的是3
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...