这周在找go的兑换产品码的bug时候,定位到是在用go的range循环一个数组的时候出问题了。bug原因是:循环的时候,给调用的方法传递一个指针参数,导致每次传递的值都是同一个值。刚开始时候,不知道为什么会这样,循环的时候值不是一直在变化,怎么值的地址没有跟着变化?后来查了资料才明白:range里面的是指针数据就是一个copy值,指针本身都是指向同一个地址。
这个是一个测试代码:12345678package mainfunc main() { arr := []int{1, 2, 3, 4} for i, v := range arr { println(&arr[i], "vs.", &v) }}
结果:
12340xc208031f38 vs. 0xc208031f200xc208031f40 vs. 0xc208031f200xc208031f48 vs. 0xc208031f200xc208031f50 vs. 0xc208031f20
从结果可以看出,用range循环数组的时候,数组的值一直在变化,但是指针的值始终没变。