关于 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回答

bobby

2020-11-26

如果函数的返回值是无名的(不带命名返回值),则go语言会在执行return的时候会执行一个类似创建一个临时变量作为保存return值的动作,而有名返回值的函数,由于返回值在函数定义的时候已经将该变量进行定义,在执行return的时候会先执行返回值保存操作,而后续的defer函数会改变这个返回值(虽然defer是在return之后执行的,但是由于使用的函数定义的变量,所以执行defer操作后对该变量的修改会影响到return的值

1
1
苏近之2020
非常感谢!
2020-11-27
共1条回复

Go+Python打造电商系统 自研微服务框架 抓紧高薪机遇

快速转型Go工程师,成为具备双语言后端能力的开发者

508 学习 · 530 问题

查看课程