Golang 中 `array` 和 `slice{array,array,...}` 有什么区别?这是很多初学者常问的问题。php小编子墨为您解答:在Golang中,`array` 是一个固定长度的序列,一旦定义后,长度就无法改变。而 `slice` 则是一个动态长度的序列,可以根据需要进行扩容或缩小。此外,`array` 的长度是在定义时确定的,而 `slice` 的长度可以在运行时动态改变。因此,在使用时,需要根据实际需求选择合适的数据结构。
问题内容
我很想知道为什么,请给我一点提示。
我想将一个数组附加到res
中,res
是一个二维切片。所以我需要先转换。
当我将数组转换为切片时,出现错误。
// i need a map to remove duplicates
mm := map[[3]int]bool{}
mm[[3]int{-1, -1, 2}] = true
mm[[3]int{-1, -1, 2}] = true
mm[[3]int{-1, 0, 1}] = true
var res [][]int
for k, _ := range mm {
res = append(res, k[:])
}
fmt.printf("the res is %v\n", res)
the res is [[-1 0 1] [-1 0 1]]
但是结果不是我想要的。
然后我试探性地修改了一下for循环
for k, _ := range mm {
//res = append(res, k[:])
res = append(res, []int{k[0], k[1], k[2]})
}
the res is [[-1 0 1] [-1 -1 2]]
现在结果是对的,但是为什么呢?
k[:]
和 []int{k[0],k[1],k[2]}
有什么区别?
解决方法
将循环更改为
for k, _ := range mm {
j := k
res = append(res, j[:])
}
您的原始循环声明了一个类型为 [3]int
的变量 k
,该变量在内存中具有特定位置。循环的每次迭代,都会将映射 mm
中的不同键复制到该变量。到目前为止,一切顺利。
当您使用 k[:]
将其转换为切片时,它会创建一个切片标头,指向数组 k
。这里出错了 - 循环的下一次迭代,k
的值被覆盖。循环中创建的所有切片都指向内存中同一位置的同一支持数组 k
。
通过首先将 k
的值复制到在循环内声明的变量,您可以为每个切片提供自己的支持数组,从而避免了该问题。
以上就是Golang 中 `array` 和 `slice{array,array,...}` 有什么区别?的详细内容,更多请关注编程网其它相关文章!