Una sezione è solo una finestra su parte di un array, non ha una memoria specifica.
Ciò significa che se si dispone di due sezioni sulla stessa parte di un array, entrambe le sezioni devono "contenere" gli stessi valori.
Ecco esattamente ciò che accade qui:
- Quando si esegue il primo
append
, si ottiene una nuova fetta di dimensioni 2
su un array di fondo di dimensioni 2
.
- Quando si esegue la prossima
append
, si ottiene una nuova fetta di dimensioni 3
ma la matrice di fondo è di dimensioni 4
(append
di solito assegna più spazio di quello immediatamente necessario in modo che non ha bisogno di allocare ad ogni append) .
- Ciò significa che il prossimo
append
non ha bisogno di un nuovo array. Quindi, x
e utilizzeranno entrambi lo stesso array sottostante della sezione precedente s
. Scrivi 11
e poi 12
nello stesso slot di questo array, anche se ottieni due sezioni diverse (ricorda che sono solo finestre).
È possibile verificare che stampando la capacità della fetta dopo ogni Aggiungi:
fmt.Println(cap(s))
Se si desidera avere valori diversi in x
e y
, si dovrebbe fare un copy, per esempio come questo :
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)
Un'altra soluzione qui sarebbe stato quello di forzare la capacità della matrice dietro il s
fetta essere non superiore alla necessità ed uno (assicurando così le due seguenti append
hanno ad utilizzare un nuovo array):
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)
Vedi anche Re-slicing slices in Golang
fonte
2014-12-19 14:39:56