В Golang упоминается:
Значения карты и среза ведут себя как указатели: они являются дескрипторами, которые содержат указатели на базовую карту или данные среза.Копирование значения карты или фрагмента не копирует данные, на которые он указывает.
Способ добавления фрагмента s
- создание нового фрагмента путем добавления копии структуры Test вs
ломтик.Следовательно, вы не устанавливаете указатель на исходную структуру Test
.Так что если данные изменяются внутри структуры, они также будут отражены в срезе.Это проблема, с которой вы сталкиваетесь.
initial.elems = append(initial.elems, "apple")
fmt.Println(initial.elems) // #1 [apple]
s := make([]Test, 0) // this should be pointer to the struct to have teh changes in future to original struct.
s = append(s, initial) // appending to the s slice
Создайте указатель на структуру Test
при создании слайса s
, который будет отражать это изменение всякий раз, когда вы изменяете элементы внутри исходной структуры.Например:
package main
import "fmt"
type Test struct {
elems []string
}
func main() {
initial := Test{
elems: make([]string, 0),
}
initial.elems = append(initial.elems, "apple")
fmt.Println(initial.elems) // #1 [apple]
s := make([]*Test, 0) // create a pointer to Test struct.
s = append(s, &initial)
initial.elems = append(initial.elems, "bannana")
fmt.Println(initial.elems) // #2 [apple bannana]
fmt.Printf("%+v\n",*s[0]) // #3 [apple banana]
second := s[0]
second.elems = append(second.elems, "carrot")
fmt.Println(second.elems) // #4 [apple bannana carrot]
}
Вывод: -
[apple]
[apple bannana]
{elems:[apple bannana]}
[apple bannana carrot]
Рабочий код на Go Playground