golang defer 以及 函式棧和return
阿新 • • 發佈:2020-08-04
defer 作為延遲函式存在,在函式執行結束時才會正式執行,一般用於資源釋放等操作
參考一段程式碼https://mp.weixin.qq.com/s/yfH0CBnUBmH0oxfC2evKBA來分析defer 函式壓棧操作
package def_test import ( "fmt" "testing" ) func GetFn() func() { fmt.Println("outside") return func() { fmt.Println("Inside") } } func TestDefer(t *testing.T) { defer GetFn()() fmt.Println("Here") }
這裡實際輸出順序為
outside Here Inside
原因在於在當執行程式碼時,當執行到 "defer GetFn()()"這一行程式碼時,由於defer作為延遲函式存在獨立的棧,需要將GetFn()()方法壓入棧中;對於GetFn()()而言這個方法實際是先獲取GetFn()方法返回的函式,對返回的函式再次執行;
因此對於defer 棧中實際入棧的是GetFn()返回的方法,為了得到返回的函式,因此在執行入棧操作之前先執行了GetFn()函式,輸出列印了"outside"
程式碼繼續往下執行 "fmt.Println("Here")", 由於defer作為延遲函式存在,在函式正式返回之前才會正式執行defer已入棧的函式"func() { fmt.Println("Inside")}"