go语言defer语句与函数返回值:详解一个易混淆的案例
本文分析一个Go语言中defer语句与函数返回值的典型案例,解释为什么修改defer中返回值的副本不会改变最终结果,以及如何正确修改代码以达到预期效果。
以下代码片段展示了一个常见的误区:
func f3() (r int) { defer func(r int) { r = r + 5 }(r) return 1}
登录后复制
f3函数返回一个整数r。defer语句中的匿名函数在f3函数返回前执行。关键在于,匿名函数的参数r是f3函数返回值r的副本,而非引用。
当执行return 1时,r的值被设置为1。随后,defer语句执行匿名函数。然而,修改匿名函数参数r(副本)的值,并不会影响f3函数返回值r。因此,f3最终返回1,而非预期的6。
立即学习“go语言免费学习笔记(深入)”;
为了得到预期结果(此处应为6,而非5),我们需要避免修改副本。正确的代码如下:
func f3() (r int) { defer func(t int) { r = t + 5 }(r) return 1}
登录后复制
在这个修正版本中,匿名函数的参数t仍然是r的副本,但我们直接将t + 5的结果赋值给f3函数的返回值r,从而修改了f3函数的返回值。return 1语句仍然存在,但最终返回的是r的最终值。
另一个更简洁的正确版本:
func f3() (r int) { r = 1 defer func() { r += 5 }() return}
登录后复制
此版本直接在defer中修改r,避免了参数传递的副本问题,最终返回6。
总结:Go语言中defer语句执行时,其参数是函数返回值的副本。直接在defer中修改副本并不会影响函数的返回值。要修改返回值,需要在defer中直接操作函数的返回值本身。 理解这一点对于编写正确高效的Go代码至关重要。
以上就是Go语言defer与函数返回值:为什么修改defer中的返回值副本不会改变最终结果?或者Go语言中defer语句如何影响函数返回值:一个令人迷惑的案例分析的详细内容,更多请关注【创想鸟】其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。
发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2537521.html