Golang遍历map将数组key转切片追加到[][]int时重复问题
Go代码问题解答
问题成因
- Go 1.22 之前的版本中,
for range循环的迭代变量会被复用:你代码里for val := range myMap中的val是固定内存地址的变量,每次循环只会把新的key值覆盖到该变量上,不会为每次迭代单独分配内存。 - 你使用
val[:]生成切片时,切片的底层指针直接指向val这个数组的内存地址,最终array里存储的所有切片都指向同一块内存。循环结束后这块内存存储的是最后一次遍历得到的key值,所以打印时所有元素都显示为同一个值。
修复方案
每次循环时将当前迭代值拷贝到新的局部变量,再转切片追加即可,修改后的循环逻辑如下:
for val := range myMap { currentVal := val // 将当前迭代值拷贝到独立内存的新变量 array = append(array, currentVal[:]) }
也可以通过显式拷贝切片实现:
for val := range myMap { tmp := make([]int, 3) copy(tmp, val[:]) array = append(array, tmp) }
如果你升级到 Go 1.22 及以上版本,官方已经修改了for range的迭代变量语义,每次循环都会为迭代变量重新分配内存,你的原始代码无需修改也能得到预期结果。
内容的提问来源于stack exchange,提问作者lajosdeme
相关产品推荐
相关产品推荐

