不带指针且无名参数返回
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
最后返回x,在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
不带指针且有名参数返回
package main
import (
"fmt"
"testing"
)
func test(x int) (t int) {
defer func() {
t += i
}()
return 2
}
func Test(t *testing.T) {
fmt.Println(*test(1))
}
执行结果
=== RUN Test
3
— PASS: Test (0.00s)
PASS
分析
也是先执行了return,把2赋值给了t,此时t等于2
然后执行defer,因为t是全局变量在函数内有效
,所以t加1,等于3
最后return返回t,此时t等于3
打印3
结论
在Golang中都是,先执行return赋值然后再执行defer最后return返回