当函数中有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 开始打印的。
网友评论