Je pense qu'il est important de souligner et de savoir que si la tranche de destination (la tranche à laquelle vous ajoutez) a une capacité suffisante, l'ajout se fera "sur place", en redimensionnant la destination (redimensionner pour augmenter sa longueur afin d'être pouvant accueillir les éléments annexes).
Cela signifie que si la destination a été créée en découpant un tableau ou une tranche plus grand qui a des éléments supplémentaires au-delà de la longueur de la tranche résultante, ils peuvent être écrasés.
Pour démontrer, voir cet exemple:
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)
Sortie (essayez-la sur le 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]
Nous avons créé un tableau "de support" a
de longueur 10
. Ensuite, nous créons la x
tranche de destination en découpant ce a
tableau, la y
tranche est créée à l'aide du littéral composite []int{3, 4}
. Maintenant , quand nous ajoutons y
à x
, le résultat est le prévu [1 2 3 4]
, mais ce qui peut être surprenant est que le réseau de soutien a a
également changé, parce que la capacité de x
est -ce 10
qui suffit à ajouter y
à elle, donc x
est resliced qui utilisera également le même a
tableau de sauvegarde, et append()
copiera des éléments de y
dedans là-dedans.
Si vous voulez éviter cela, vous pouvez utiliser une expression de tranche complète qui a la forme
a[low : high : max]
qui construit une tranche et contrôle également la capacité de la tranche résultante en la définissant sur max - low
.
Voir l'exemple modifié (la seule différence est que nous créons x
comme ceci 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)
Sortie (essayez-le sur le 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]
Comme vous pouvez le voir, nous obtenons le même x
résultat mais le tableau de sauvegarde a
n'a pas changé, car la capacité de x
était "seulement" 2
(grâce à l'expression de tranche complète a[:2:2]
). Donc, pour faire l'ajout, un nouveau tableau de support est alloué qui peut stocker les éléments des deux x
et y
, qui est distinct de a
.
append()
une fonction variadique et le...
vous permet de passer plusieurs arguments à une fonction variadique à partir d'une tranche.