Go语言的中的For循环之大坑

发表于:2019-10-21 09:45

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:架构之路    来源:今日头条

#
java
#
Java
  For循环在我们日常编码中可能用的很多。在很多业务场景中我们都需要用for循环处理。但golang中的for循环有一个大大大的坑,大家可否遇到。直接上代码:
  
  我们写一个测试类,定义一个切片数组,然后循环迭代每个元素,将元素的值放到另一个切片。循环finalArrays的时候按照我们的预期应该输出1、2、3、4。但事与愿违,输出的结果如下图:
  
  懵逼了吧!为什么会出现这种奇怪的现象呢?这就是golang的循环变量的作用域导致的。
  在golang的for循环中,循环内部创建的函数变量都是共享同一块内存地址,for循环总是使用同一块内存去接收循环中的的value变量的值。不管循环多少次,value的内存地址都是相同的。事实确实如此,我们输出value的内存地址看下:
  
  所以,可以看到,整个4次循环过程中,所有变量值都是在0xc0000b8780这个地址上迭代的。4次循环都指向的是同一块内存地址,最后一次赋值的操作变量的值是4,指向了这块内存地址,所以前三次的值都变成了4。那我们怎么优化呢?我们只需要定义临时变量。
 
  我们定义一个临时变量tmp,将value的值赋给tmp,问题就解决了。
  评论中很多同学说,例子不足以说明这个问题,我这里写一段我们实际业务场景的代码,大家看看。
  
  Bid结构体中的属性我就不贴图了。这种情况很多新手同学会犯,尤其是从java转go的同学。

      本文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号