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ą” ao długości 10. Następnie tworzymy xdocelowy plasterek poprzez wycięcie tej atablicy, yplasterek jest tworzony przy użyciu literału złożonego []int{3, 4}. Teraz, kiedy dołączy ydo x, wynik jest oczekiwany [1 2 3 4], ale co może być zaskakujące jest to, że tablica podkład arównież zmieniona, ponieważ pojemność xIs 10która jest wystarczająca, aby dołączyć ydo niego, więc xjest resliced które również korzystają z tego samego atablicę 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 xten 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 xwynik, ale tablica podkładu asię nie zmieniła, ponieważ pojemność xbył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 xi y, która jest inna a.
append()funkcja variadic, i...pozwala przekazać wiele argumentów do funkcji variadic z wycinka.