有一个数组类型:
const Size = 16
type idType [Size]byte
以及结构类型:
type srcListItem struct {
id idType
}
type destListItem struct {
id []byte
}
我用以下两项初始化源列表:
srcList := make([]srcListItem, 2)
for i := 0; i < Size; i++ {
srcList[0].id[i] = byte(i)
srcList[1].id[i] = byte(i + Size)
}
然后,我尝试将其复制到destListItem
类型的两个切片中。复制其中一个时,我使用item,并复制另一个索引:
for i, item := range srcList {
fmt.Println("id slice: ", srcList[i].id)
item1 := destListItem {
id: item.id[:],
}
destList1 = append(destList1, item1)
item2 := destListItem {
id: srcList[i].id[:],
}
destList2 = append(destList2, item2)
}
打印结果切片的输出为:
destList1 items array: [{[16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31]} {[16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31]}]
destList2 items array: [{[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15]} {[16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31]}]
请告诉我为什么destList1中的项目包含相同的ID? 这是完整的源代码:https://play.golang.org/p/IJM5cllSb1B
谢谢。
P。 S.我知道一些解决方法。例如,如果源列表为[]*srcListItem
类型,则在两种情况下结果都是正确的。
但是为什么它如此奇怪呢?
答案 0 :(得分:1)
我相信这是item
超出范围和for循环重用内存的结果。这意味着当您将item
附加到切片时,即使切片“超出范围”也要坚持使用。当for循环更改内存的基础值时,您会在切片中看到这些更改。