1
2
3
4
5
6
7
8
9
10
11
12
13
14
func main(){
fmt.Println(deferReturn)
}
func deferReturn() int{
i := 1
defer func(){
fmt.Println("Defer")
i = 1
}()
return func()int{
fmt.Println("Return")
return i
}()
}
运行结果:
1
2
3
Return
Defer
1
deferreturndeferi =1i21returnreturnreturn
我们可以验证这一个观点:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
func main(){
...
fmt.Println("main: ", x, &x)
}
func deferReturn() int{
...
defer ...{
fmt.Println("Defer: ", i, &i)
...
}()
return ...{
fmt.Println("Return: ", i, &i)
...
}()
}
程序的输出为:
1
2
3
Return: 1 0xc042008238
Defer: 1 0xc042008238
main: 1 0xc042008230 //main函数中的i的地址和deferReturn()中的i的地址是不一样的
如果把函数的返回值改成指针类型,这时候的main函数中的返回值就会和函数体内的一致:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
func main(){
x := deferReturn()
fmt.Println("main: ", x, *x)
}
func deferReturn()*int{
i := 1
p := &i
defer func() {
*p = 1
fmt.Println("defer: ", p, *p)
}()
return func() *int{
fmt.Println("Return: ", p, *p)
return p
}()
}
结果:
1
2
3
Return: 0xc0420361d0 1
defer: 0xc0420361d0 2
main: 0xc0420361d0 2