本文主要研究一下golang的defergolang
對於命名返回值
),而後執行defer,最後函數返回// f returns 42 func f() (result int) { defer func() { // result is accessed after it was set to 6 by the return statement result *= 7 }() return 6 }
這裏return先給result賦值爲6,以後執行defer,result變爲42,最後返回42
func f() int { result := 6 defer func() { // result is accessed after it was set to 6 by the return statement result *= 7 }() return result }
這裏return肯定返回值6,以後defer修改result,最後函數返回return肯定的返回值
func multiDefer() { for i := 3; i > 0; i-- { defer func(n int) { fmt.Print(n, " ") }(i) } for i := 3; i > 0; i-- { defer fmt.Print(i, " ") } }
多個defer函數,按順序逆序執行,這裏輸出1 2 3
var fc func() string func main() { fmt.Println("hello") defer fc() }
因爲defer指定的func爲nil,這裏panic
func main() { for i := 3; i > 0; i-- { defer func() { fmt.Print(i, " ") }() } }
因爲defer這裏調用的func沒有參數,等執行的時候,i已經爲0,於是這裏輸出3個0
defer能夠拆解爲return賦值,defer執行,最後代碼返回三步;defer的順序按逆序執行。c#