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" acon lunghezza 10. Quindi creiamo lo xslice di destinazione tagliando questo aarray, lo yslice viene creato usando il letterale composito []int{3, 4}. Ora, quando aggiungiamo ya x, il risultato è il previsto [1 2 3 4], ma ciò può essere sorprendente è che la matrice di supporto aanche cambiato, perché la capacità di xIS 10che è sufficiente da aggiungere yad esso, così xè resliced che sarà anche utilizzare la stessa amatrice di supporto, e append()copierà gli elementi ylì 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 xquesto 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 xrisultato ma l'array di supporto anon è cambiato, perché la capacità di xera "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 xe y, che è distinto da a.
append()una funzione variadica e...consente di passare più argomenti a una funzione variadica da una sezione.