當(dāng)函數(shù)中有defer語句别厘,會延遲此語句的執(zhí)行虱饿,直到函數(shù)返回后才執(zhí)行。
defer fmt.Println("")
defer后面的是參數(shù)
延遲調(diào)用的參數(shù)是立刻生成的触趴,但是在上層函數(shù)返回前都不會去執(zhí)行氮发。
看例子,并運(yùn)行看結(jié)果
package main
import "fmt"
func main() {
defer fmt.Print("Hello")
fmt.Print("World")
}
你認(rèn)為執(zhí)行結(jié)果是什么呢雕蔽?肯定不是HelloWorld折柠,而是
WorldHello
延遲的函數(shù)調(diào)用是被壓入一個棧中。當(dāng)函數(shù)返回時批狐,會按照后進(jìn)先出的原則扇售,調(diào)出被延遲的函數(shù)調(diào)用。請看下面例子中嚣艇,i的打印順序承冰。
package main
import (
"fmt"
)
func main() {
fmt.Println("Begin...")
for i := 0; i < 10; i++{
defer fmt.Println(i)
}
fmt.Println("Done")
}
運(yùn)行結(jié)果
Begin...
Done
9
8
7
6
5
4
3
2
1
0
看明白了么?
整個函數(shù)的輸出已經(jīng)運(yùn)行完了食零,打印了 Done 困乒,然后才開始打印 for 循環(huán)的 defer,并且是后進(jìn)先出的方式贰谣,是從 i = 9 開始打印的娜搂。