卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章34499本站已运行393

Golang 中 `array` 和 `slice{array,array,...}` 有什么区别?

golang 中 `array` 和 `slice{array,array,...}` 有什么区别?

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 %vn", 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 的值复制到在循环内声明的变量,您可以为每个切片提供自己的支持数组,从而避免了该问题。

卓越飞翔博客
上一篇: PHP openssl des-ede3-cbc 到 Golang
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏