我有一个关于golang延迟语句的问题:在golang中,defer语句是在return语句之前还是之后执行?
我已经阅读了Defer_statements,但我没有找到答案。
我进行了一个简单的测试:
func test1() (x int) {
defer fmt.Printf("in defer: x = %d\n", x)
x = 7
return 9
}
func test2() (x int) {
defer func() {
fmt.Printf("in defer: x = %d\n", x)
}()
x = 7
return 9
}
func test3() (x int) {
x = 7
defer fmt.Printf("in defer: x = %d\n", x)
return 9
}
func main() {
fmt.Println("test1")
fmt.Printf("in main: x = %d\n", test1())
fmt.Println("test2")
fmt.Printf("in main: x = %d\n", test2())
fmt.Println("test3")
fmt.Printf("in main: x = %d\n", test3())
}
在test1()
中,在defer之后使用Printf
打印x。
在test2()
中,使用匿名函数在defer之后打印x。
在test3()
中,在x = 7
之后再defer,使用Printf
打印x。
但结果是:
test1
in defer: x = 0
in main: x = 9
test2
in defer: x = 9
in main: x = 9
test3
in defer: x = 7
in main: x = 9
那么,有人能解释一下吗: 1. 为什么会得到这个结果?为什么test1打印0,test2打印9,test3打印7。 2. 延迟语句是在返回之后执行还是在返回之前执行?
非常感谢。