Penso che sia importante sottolineare e sapere che se lo slice di destinazione (lo slice a cui si aggiunge) ha una capacità sufficiente, l'appendice avverrà "sul posto", rislicando la destinazione (cercando di aumentare la sua lunghezza per essere in grado di accogliere gli elementi appendibili).
Ciò significa che se la destinazione è stata creata tagliando un array o una sezione più grande che ha elementi aggiuntivi oltre la lunghezza della sezione risultante, potrebbero essere sovrascritti.
Per dimostrare, vedi questo esempio:
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)
Output (provalo sul 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]
Abbiamo creato un array di "supporto" a
con lunghezza 10
. Quindi creiamo lo x
slice di destinazione tagliando questo a
array, lo y
slice viene creato usando il letterale composito []int{3, 4}
. Ora, quando aggiungiamo y
a x
, il risultato è il previsto [1 2 3 4]
, ma ciò può essere sorprendente è che la matrice di supporto a
anche cambiato, perché la capacità di x
IS 10
che è sufficiente da aggiungere y
ad esso, così x
è resliced che sarà anche utilizzare la stessa a
matrice di supporto, e append()
copierà gli elementi y
lì dentro.
Se si desidera evitare ciò, è possibile utilizzare un'espressione di sezione completa che ha il modulo
a[low : high : max]
che costruisce una sezione e controlla anche la capacità della sezione risultante impostandola su max - low
.
Vedi l'esempio modificato (l'unica differenza è che creiamo in x
questo modo 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)
Output (provalo sul 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]
Come puoi vedere, otteniamo lo stesso x
risultato ma l'array di supporto a
non è cambiato, perché la capacità di x
era "solo" 2
(grazie all'espressione di sezione intera a[:2:2]
). Quindi, per fare l'appendice, viene allocato un nuovo array di supporto che può memorizzare gli elementi di entrambi x
e y
, che è distinto da a
.
append()
una funzione variadica e...
consente di passare più argomenti a una funzione variadica da una sezione.