go - 为什么golang中的关键字范围适用于2d slice ?

标签 go slice

我想复制一份字节,将类型从[][4]byte转换为[][]byte。我希望跟随者代码返回[[1 2 3 4] [2 3 4 5]],但实际上得到了[[2 3 4 5] [2 3 4 5]]

package main

import "fmt"

func main() {
    ids := [][4]byte{[4]byte{1, 2, 3, 4}, [4]byte{2, 3, 4, 5}}

    var slices [][]byte
    for _, id := range ids {
        slices = append(slices, id[:])
    }
    fmt.Println(slices)
}
为什么?
为什么在 slice 上附加id[:]会覆盖 slice 中的第一个元素?

最佳答案

正如Marc所说,您将通过id附加引用。
因此,当您进行迭代并且id更改其值时,您要附加到其上的“slice ”将使用id新值进行重新评估。
为了避免这种情况:

for i := range ids { 
     slices = append(slices, ids[i][:]) // here you are referring to the value at index i of ids
}

关于go - 为什么golang中的关键字范围适用于2d slice ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63889213/

相关文章:

在 go 中返回锁定互斥锁的好方法

types - 不能在函数参数中使用 document[0](类型 uint8)作为类型 []byte

file - base64 解码器(io.Reader 实现)不当行为

optimization - 在 Rust 中从迭代器填充切片的最佳方法是什么?

python - 使用矢量化加速计算

mongodb - 使用 mgo 通过输入选择查询的选定字段

go - 这个 go switch 语句有什么问题?

python - 将列表环绕为切片操作

python - 根据输入对大列表进行切片

python - 将 pandas 数据框中的一些行添加到下一个,然后删除它们