You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 23:48:02