将数组列表复制到切片列表会出错

时间:2018-12-18 12:53:21

标签: arrays go slice

有一个数组类型:

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类型,则在两种情况下结果都是正确的。 但是为什么它如此奇怪呢?

1 个答案:

答案 0 :(得分:1)

我相信这是item超出范围和for循环重用内存的结果。这意味着当您将item附加到切片时,即使切片“超出范围”也要坚持使用。当for循环更改内存的基础值时,您会在切片中看到这些更改。