Это кажется очень странным. В al oop есть локальная переменная slice
с новым значением, присвоенным каждому l oop, и я добавляю этот фрагмент к глобальному sliceWrappers
. После завершения l oop все значения внутри глобального среза содержат только ссылку на последнее значение, установленное в этой локальной переменной среза.
Код:
package main
import (
"fmt"
"strconv"
)
func main() {
var sliceWrappers [][]string
initialSlice := append([]string{}, "hi")
initialSlice = append(initialSlice, "there")
// Remove this line and it works fine
initialSlice = append(initialSlice, "I'm")
for i := 0; i < 2; i++ {
slice := append(initialSlice, strconv.Itoa(i))
fmt.Printf("Slice Value : %+v, Initial Value : %+v\n", slice, initialSlice)
sliceWrappers = append(sliceWrappers, slice)
}
for _, sliceWrapper := range sliceWrappers {
fmt.Printf("%+v\n", sliceWrapper)
}
}
Фактический результат:
Slice Value : [hi there I'm 0], Initial Value : [hi there I'm]
Slice Value : [hi there I'm 1], Initial Value : [hi there I'm]
[hi there I'm 1]
[hi there I'm 1]
Ожидаемый результат:
Slice Value : [hi there I'm 0], Initial Value : [hi there I'm]
Slice Value : [hi there I'm 1], Initial Value : [hi there I'm]
[hi there I'm 0] <------ This is not happening
[hi there I'm 1]
Если я удаляю строку initialSlice = append(initialSlice, "I'm")
, она работает отлично.
Slice Value : [hi there 0], Initial Value : [hi there]
Slice Value : [hi there 1], Initial Value : [hi there]
[hi there 0] <------ Works Perfectly
[hi there 1]
Полагаю, это как-то связано с append
Встроенная функция append добавляет элементы в конец среза. Если он имеет достаточную емкость, место назначения повторно нарезается для размещения новых элементов.
Если за это отвечает вышеуказанное условие, то не должно быть значение initialSlice
, которое было напечатано внутри l oop также должно быть таким же, как slice
?
Детская площадка - https://play.golang.org/p/b3SDGoA2Lzv
PS: К сожалению, я написал тестовые примеры для мой код всего с 3 уровнями вложенности, и он прошел нормально. Теперь мне нужно позаботиться о копировании для срезов внутри петель.