不带指针返回
package main
import (
"fmt"
"testing"
)
func test(x int) int {
defer func() {
x = 100
fmt.Println(x)
}()
return x
}
func Test(t *testing.T) {
fmt.Println(test(1))
}
执行结果
=== RUN Test
100
1
--- PASS: Test (0.00s)
PASS
分析
先执行了return,把x的结果已经赋值给了返回int,此时x为1
然后执行defer,此时打印100
最后在Test函数中打印第一步赋值的1
指针返回
package main
import (
"fmt"
"testing"
)
func test(x int) *int {
defer func() {
x = 100
}()
return &x
}
func Test(t *testing.T) {
fmt.Println(*test(1))
}
执行结果
=== RUN Test
100
--- PASS: Test (0.00s)
PASS
分析
也是先执行了return,把&x指针地址赋给了返回*int,此时x为1
然后执行defer,此时打印100,此处注意其实&x地址所指向的值已经变为100
最后在Test函数中打印第一步赋值的&x,这时候x指针指向的值已经变为100
打印100
结论
在golang中都是先执行return然后再执行defer
有疑问加站长微信联系(非本文作者)