當函數中有defer語句,會延遲此語句的執行,直到函數返回后才執行。
defer fmt.Println("")
defer后面的是參數
延遲調用的參數是立刻生成的,但是在上層函數返回前都不會去執行。
看例子,并運行看結果
package main
import "fmt"
func main() {
defer fmt.Print("Hello")
fmt.Print("World")
}
你認為執行結果是什么呢?肯定不是HelloWorld,而是
WorldHello
延遲的函數調用是被壓入一個棧中。當函數返回時,會按照后進先出的原則,調出被延遲的函數調用。請看下面例子中,i的打印順序。
package main
import (
"fmt"
)
func main() {
fmt.Println("Begin...")
for i := 0; i < 10; i++{
defer fmt.Println(i)
}
fmt.Println("Done")
}
運行結果
Begin...
Done
9
8
7
6
5
4
3
2
1
0
看明白了么?
整個函數的輸出已經運行完了,打印了 Done ,然后才開始打印 for 循環的 defer,并且是后進先出的方式,是從 i = 9 開始打印的。