关于 defer 中值传递和引用传递的问题
来源:9-6 defer机制你忽略了很多细节

苏近之2020
2020-11-24
老师在课程中举例如下:
func handle() int {
x := 10
defer func() {
x++
}()
return x
}
func main() {
fmt.Println(handle())
}
执行这段代码,打印的结果是 10。这没有问题,老师解释了这是因为 x 是值类型,而在 return 之前会临时保存 x 的值。
但是如果我把代码的handle
函数稍微改一下,结果就不一样了, 代码如下:
func handle() (x int) {
x = 10
defer func() {
x++
}()
return x
}
其实就是把变量 x 的定义放到了返回值列表中。就导致了 return x 的值变成了 11,而不是上面示例中的 10。这是为什么呢?
我想它肯定不是因为值类型或者引用类型的缘故,因为此时 x 仍然是值类型,所以我就不明白了,还望老师能够给予解答。十分感谢!!!
写回答
1回答
-
如果函数的返回值是无名的(不带命名返回值),则go语言会在执行return的时候会执行一个类似创建一个临时变量作为保存return值的动作,而有名返回值的函数,由于返回值在函数定义的时候已经将该变量进行定义,在执行return的时候会先执行返回值保存操作,而后续的defer函数会改变这个返回值(虽然defer是在return之后执行的,但是由于使用的函数定义的变量,所以执行defer操作后对该变量的修改会影响到return的值
112020-11-27
相似问题