排列数组类型的映射键并切片每个数组会为每次迭代提供相同的数组

问题描述

在尝试将地图的int数组键添加到int slice的切片时,无法按预期进行范围调整和使用arr[:]来切片数组。结果切片仅包含映射中“第一个”键的重复项(注释为循环)。但是,将数组键复制到另一个变量并切片新变量是可行的,并且结果切片包含不同的映射键值。我想知道为什么需要复制。 k(数组键)不是在每次迭代时从映射中复制为新数组吗?我不知道在哪里可以找到有关此行为的文档,因此不胜感激链接和资源:-)

ansSlice := [][]int{}

//ans is a map with [3]int key type

/* For some reason,this doesn't work,and appends values from the same array to ansSlice
for k,_ := range ans {
    ansSlice = append(ansSlice,k[:])
}*/

// however,this works
for k,_ := range ans {
    key := k
    ansSlice = append(ansSlice,key[:])
}

解决方法

由于地图键类型是数组,因此分配:

for k,_ := range ans {

将为每次迭代重写k。这将重写数组k的内容。切片k[:]指向k作为基础数组,因此所有以k作为基础数组的切片也将被覆盖。

像您一样,为每次迭代复制数组。这样会为您添加的切片创建单独的数组。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...