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