For循环在我们日常的编码中可能用的比较多。在很多业务场景中,我们需要用到for循环处理。但是golang中的for循环有个大坑,你能遇到吗。直接上代码:我们写一个测试类,定义一个切片数组,然后循环遍历每个元素,把元素的值放到另一个切片中。当循环finalArrays时,我们应该按预期输出1、2、3、4。但是事与愿违,输出结果如下:你好糊涂啊!为什么会出现这种奇怪的现象呢?这是golang的循环变量作用域造成的。在golang的for循环中,循环内部创建的函数变量共享同一个内存地址,for循环总是使用同一个内存来接收循环中value变量的值。无论循环多少次,value的内存地址都是一样的。确实如此。再来看输出值的内存地址:因此,我们可以看到,在整个4次循环中,所有的变量值都在地址0xc0000b8780处进行了迭代。4次循环都指向同一个内存地址,最后赋值的操作变量的值为4,指向这个内存地址,所以前3次的值就变成了4。那我们怎么优化呢?我们只需要定义临时变量。我们定义一个临时变量tmp,将value的值赋给tmp,问题就解决了。评论里很多同学说例子不足以说明这个问题。我这里针对我们实际的业务场景写一段代码。让我们来看看。我不会映射Bid结构中的属性。很多新手同学都会犯这种情况,尤其是从java转过来的同学。
