作者:许祥生老师 | 来源:互联网 | 2022-12-02 17:50
我有一个关于golang延迟的问题:golang延迟语句是在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()
,Printf
用于延迟后打印x。在中test2()
,使用匿名函数在延迟后打印x。在中test3()
,Printf
用于在延迟后打印x,但在之后延迟打印x = 7
。
但是结果是:
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.延迟语句在返回之后还是返回之前执行?
非常感谢。