Uważam, że ważne jest, aby zwrócić uwagę i wiedzieć, że jeśli wycinek docelowy (wycinek, do którego się dołączasz) ma wystarczającą pojemność, dołączenie nastąpi „w miejscu” poprzez przeskalowanie miejsca docelowego (przeskalowanie w celu zwiększenia jego długości, aby w stanie pomieścić elementy dodatkowe).
Oznacza to, że jeśli miejsce docelowe zostało utworzone przez wycięcie większej tablicy lub plasterka, który ma dodatkowe elementy poza długość wynikowego plasterka, mogą zostać zastąpione.
Aby to zademonstrować, zobacz ten przykład:
a := [10]int{1, 2}
fmt.Printf("a: %v\n", a)
x, y := a[:2], []int{3, 4}
fmt.Printf("x: %v, y: %v\n", x, y)
fmt.Printf("cap(x): %v\n", cap(x))
x = append(x, y...)
fmt.Printf("x: %v\n", x)
fmt.Printf("a: %v\n", a)
Wyjście (wypróbuj na Go Playground ):
a: [1 2 0 0 0 0 0 0 0 0]
x: [1 2], y: [3 4]
cap(x): 10
x: [1 2 3 4]
a: [1 2 3 4 0 0 0 0 0 0]
Stworzyliśmy tablicę „podkładową” a
o długości 10
. Następnie tworzymy x
docelowy plasterek poprzez wycięcie tej a
tablicy, y
plasterek jest tworzony przy użyciu literału złożonego []int{3, 4}
. Teraz, kiedy dołączy y
do x
, wynik jest oczekiwany [1 2 3 4]
, ale co może być zaskakujące jest to, że tablica podkład a
również zmieniona, ponieważ pojemność x
Is 10
która jest wystarczająca, aby dołączyć y
do niego, więc x
jest resliced które również korzystają z tego samego a
tablicę podkładową, a append()
skopiuje tam elementy y
.
Jeśli chcesz tego uniknąć, możesz użyć wyrażenia pełnego wycinka, które ma formę
a[low : high : max]
który konstruuje plasterek, a także kontroluje pojemność wynikowego plastra, ustawiając go na max - low
.
Zobacz zmodyfikowany przykład (jedyną różnicą jest to, że tworzymy w x
ten sposób x = a[:2:2]
:
a := [10]int{1, 2}
fmt.Printf("a: %v\n", a)
x, y := a[:2:2], []int{3, 4}
fmt.Printf("x: %v, y: %v\n", x, y)
fmt.Printf("cap(x): %v\n", cap(x))
x = append(x, y...)
fmt.Printf("x: %v\n", x)
fmt.Printf("a: %v\n", a)
Wyjście (wypróbuj na Go Playground )
a: [1 2 0 0 0 0 0 0 0 0]
x: [1 2], y: [3 4]
cap(x): 2
x: [1 2 3 4]
a: [1 2 0 0 0 0 0 0 0 0]
Jak widać, otrzymujemy ten sam x
wynik, ale tablica podkładu a
się nie zmieniła, ponieważ pojemność x
była „tylko” 2
(dzięki wyrażeniu pełnego wycinka a[:2:2]
). Aby wykonać dołączenie, przydzielana jest nowa tablica podkładu, która może przechowywać elementy obu x
i y
, która jest inna a
.
append()
funkcja variadic, i...
pozwala przekazać wiele argumentów do funkcji variadic z wycinka.