Plasterek jest tylko oknem na część tablicy, nie ma określonego miejsca.
Oznacza to, że jeśli masz dwa plasterki na tej samej części tablicy, oba plasterki muszą "zawierać" te same wartości.
Tutaj jest dokładnie to, co się dzieje tutaj:
- Po wykonaniu pierwszego
append
, pojawi się nowy kawałek wielkości 2
nad podstawowej gamie rozmiarów 2
.
- Po wykonaniu następnego
append
, pojawi się nowy kawałek wielkości 3
ale podstawowa tablica jest od wielkości 4
(append
zwykle przydziela więcej miejsca niż jeden potrzebne natychmiast, tak że nie trzeba przeznaczyć na każdym dołącz) .
- Oznacza to, że następny
append
nie potrzebuje nowej tablicy. Tak więc x
i y
oba będą używać tej samej podstawowej tablicy co poprzedni wycinek s
. Piszecie 11
, a następnie 12
w tym samym gnieździe tej tablicy, nawet jeśli otrzymacie dwa różne plasterki (pamiętajcie, że to tylko okna).
można sprawdzić, drukując zdolności plasterek po każdym dołączyć:
fmt.Println(cap(s))
Jeśli chcesz mieć różne wartości w x
i y
należy zrobić copy, na przykład jak ten :
s := []int{5}
s = append(s, 7)
s = append(s, 9)
x := make([]int,len(s))
copy(x,s)
x = append(x, 11)
y := append(s, 12)
fmt.Println(s, x, y)
Innym rozwiązaniem tutaj mogło zmusić pojemność macierzy za s
wycinka być nie większa niż potrzeba jeden ED (zapewniając w ten sposób do dwóch następujących append
mają użyć nową tablicę)
s := []int{5}
s = append(s, 7)
s = append(s, 9)
s = s[0:len(s):len(s)]
x := append(s, 11)
y := append(s, 12)
fmt.Println(s, x, y)
Patrz także Re-slicing slices in Golang