遍历数组类型的映射键并对每个数组进行切片为每次迭代提供相同的数组

当尝试将映射的 int 数组键添加到 int 切片切片时,范围和使用arr[:]切片数组无法按预期工作。结果切片仅包含映射中“第一个”键的副本(注释掉 for 循环)。但是,将数组键复制到另一个变量并对新变量进行切片是可行的,结果切片包含不同的映射键值。我想知道为什么需要复制。数组键不是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[:])

}


慕码人8056858
浏览 101回答 1
1回答

慕哥9229398

由于映射键类型是数组,因此赋值:for k,_ := range ans {每次迭代都会重写k。这将重写数组的内容k。切片k[:]指向k作为底层数组,因此所有k作为底层数组的切片也将被覆盖。和你一样,为每次迭代复制数组。这将为您附加的切片创建单独的数组。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go