背景:这个地方的 test-1 题 https://golang.dbwu.tech/traps/defer_exam/

如下 test-1 题,使用具名返回值,defer 就能修改 t 的值

package main

func foo(n int) (t int) {
	t = n
	defer func() {
		t += 3
	}()
	return t
}

func main() {
	println(foo(1))
}

但是我不使用具名,就算我把 t 移到最外层的作用域,defer 也改变不了 t 的值,我试着不在 defer 作用域内,就可以修改

package main

var t int

func foo(n int) int {
	t = n
	defer func() {
		t += 3
	}()
	return t
}

func main() {
	println(foo(1))
}

感觉被绕晕了

举报· 2379 次点击
登录 注册 站外分享
22 条回复  
lesismal 小成 6 天前
不知道谁带头搞的这些题啊,我一个都不会做、只能运行跑结果来看才知道答案。 但是我从来都不会这样用 defer 导致这种问题啊,搞这些题的人是吃得太饱了吗!
wunonglin 初学 6 天前
虽然我知道有些基础应该会,不过我写了 go3 、4 年确实没碰到过这种场景。我麻了 hhhhh
rahuahua 小成 6 天前
下面这个 defer 也是能修改 t 的值,只是返回值已经拷贝了 t 的值,不受影响了
maxwellz 小成 6 天前
返回值如果没有设置名称,defer 中的值不会改变返回值
kcross 初学 6 天前
给你看个好玩的,你试试这个 package main var t int func foo(n int) (t int) { t = n defer func() { t = t+ 3 }() return } func main() { println(foo(1)) }
uion 小成 6 天前
不会 go ,盲猜一下。参数有引用,具名参数返回时先运行 defer 。不使用具名应该是直接返回了再 defer ?
zhengfan2016 楼主 小成 6 天前
@maxwellz 对的,我就想问这个问题,为什么不设置名称 defer 就改不动呢
R136a1 初学 6 天前
值传递和引用传递的区别?
ninjashixuan 小成 6 天前
想学这类边界技巧可以关注 go101 的作者。
123下一页
返回顶部