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" ade longueur 10. Ensuite, nous créons la xtranche de destination en découpant ce atableau, la ytranche 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 xest -ce 10qui suffit à ajouter yà elle, donc xest resliced qui utilisera également le même atableau de sauvegarde, et append()copiera des éléments de ydedans 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 xcomme 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 xrésultat mais le tableau de sauvegarde an'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 xet 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.