我想复制一份字节,将类型从[][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/

10-11 08:31