Копирование списка массивов в список фрагментов работает неправильно - PullRequest
0 голосов
/ 18 декабря 2018

Существует тип массива:

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содержит идентичные идентификаторы?Вот полный исходный код: https://play.golang.org/p/IJM5cllSb1B

Спасибо.

PS Я знаю некоторые обходные пути.Например, результат будет правильным в обоих случаях, если список источников будет иметь тип []*srcListItem.Но почему это так странно работает?

1 Ответ

0 голосов
/ 18 декабря 2018

Я считаю, что это результат item выхода из области видимости и повторного использования памяти в цикле for.Это означает, что когда вы добавляете item к своему срезу, вы держитесь за него даже после того, как он «выходит из области видимости».Когда цикл for изменяет базовое значение памяти, эти изменения отражаются в вашем срезе.

...