例子 1
可以把 defer ... 分成三部分:
- 调用
defer, 计算函数的参数 - 执行
defer, 把函数推入栈 - 在 return 或者 panic 之后, 执行栈中的函数
例子:
func test() (x int) {
defer func(n int) {
fmt.Printf("in defer x as parameter: x = %d\n", n)
fmt.Printf("in defer x after return: x = %d\n", x)
}(x)
x = 7
return 9
}
func main() {
fmt.Println("test")
fmt.Printf("in main: x = %d\n", test())
}
这例子 defer 执行分为三部分:
- 调用
defer, 计算 n 的值, n = x = 0, 所以作为参数的 x 为 0. - 执行
defer, 将func(n int)(0)入栈. - 在
return 9之后执行func(n int)(0), n 在fmt.Printf("in defer x as parameter: x = %d\n", n)中已经被计算过了, x 在fmt.Printf("in defer x after return: x = %d\n", x)将被计算得到 9.
例子的输出结果:
test
in defer x as parameter: x = 0
in defer x after return: x = 9
in main: x = 9