请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于 defer 中值传递和引用传递的问题

老师在课程中举例如下:

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的值

1 回复 有任何疑惑可以回复我~
  • 提问者 苏近之2020 #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2020-11-27 17:21:02
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信