J'essaie de combiner la tranche [1, 2]
et la tranche [3, 4]
. Comment puis-je faire cela dans Go?
J'ai essayé:
append([]int{1,2}, []int{3,4})
mais j'ai:
cannot use []int literal (type []int) as type int in append
Cependant, la documentation semble indiquer que c'est possible, que me manque-t-il?
slice = append(slice, anotherSlice...)
go
append
slice
variadic-functions
Kevin Burke
la source
la source
append()
une fonction variadique et le...
vous permet de passer plusieurs arguments à une fonction variadique à partir d'une tranche.foo()
exemple ci-dessus, leis
paramètre contient une copie de la tranche d'origine, c'est-à-dire qu'il a une copie de la référence légère au même tableau, len et cap sous-jacent. Si lafoo
fonction modifie un membre, la modification sera visible sur l'original. Voici une démo . Ainsi, le seul vrai surcoût sera qu'il crée une nouvelle tranche si vous n'en avez pas déjà une, comme:foo(1, 2, 3, 4, 5)
qui créera une nouvelle tranche quiis
tiendra....
une tranche existante, elle passe simplement cette tranche. Lorsque vous passez des arguments individuels, il les rassemble dans une nouvelle tranche et la transmet. Je n'ai pas connaissance de première main de la mécanique exacte, mais je suppose que cela:foo(1, 2, 3, 4, 5)
et ceci:func foo(is ...int) {
Just de sucres à ceci:foo([]int{1, 2, 3, 4, 5})
et ceci:func foo(is []int) {
.La réponse à votre question est un exemple
s3 := append(s2, s0...)
dans la spécification du langage de programmation Go . Par exemple,la source
a[low : high : max]
) qui spécifie également la capacité maximale . Par exemple, la tranchea[0:2:4]
aura une capacité de4
et il ne peut pas être redimensionné pour inclure des éléments au-delà de cela, même si le tableau de support a un millier d'éléments après cela.Rien contre les autres réponses, mais j'ai trouvé la brève explication dans les documents plus facilement compréhensible que les exemples en eux:
la source
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:
Sortie (essayez-la sur le Go Playground ):
Nous avons créé un tableau "de support"
a
de longueur10
. Ensuite, nous créons lax
tranche de destination en découpant cea
tableau, lay
tranche est créée à l'aide du littéral composite[]int{3, 4}
. Maintenant , quand nous ajoutonsy
à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 aa
également changé, parce que la capacité dex
est -ce10
qui suffit à ajoutery
à elle, doncx
est resliced qui utilisera également le mêmea
tableau de sauvegarde, etappend()
copiera des éléments dey
dedans là-dedans.Si vous voulez éviter cela, vous pouvez utiliser une expression de tranche complète qui a la forme
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 cecix = a[:2:2]
::Sortie (essayez-le sur le Go Playground )
Comme vous pouvez le voir, nous obtenons le même
x
résultat mais le tableau de sauvegardea
n'a pas changé, car la capacité dex
était "seulement"2
(grâce à l'expression de tranche complètea[:2:2]
). Donc, pour faire l'ajout, un nouveau tableau de support est alloué qui peut stocker les éléments des deuxx
ety
, qui est distinct dea
.la source
Je voudrais souligner la réponse @icza et la simplifier un peu car c'est un concept crucial. Je suppose que le lecteur connaît bien les tranches .
Ceci est une réponse valable à la question. MAIS si vous devez utiliser les tranches «a» et «c» plus tard dans le code dans un contexte différent, ce n'est pas le moyen sûr de concaténer les tranches.
Pour expliquer, lisons l'expression non pas en termes de tranches, mais en termes de tableaux sous-jacents:
append () ne crée pas nécessairement un nouveau tableau! Cela peut conduire à des résultats inattendus. Voir l' exemple Go Playground .
Utilisez toujours la fonction make () si vous voulez vous assurer que le nouveau tableau est alloué pour la tranche. Par exemple, voici quelques options laides mais assez efficaces pour la tâche.
la source
Fonction append () et opérateur d'étalement
Deux tranches peuvent être concaténées en utilisant la
append
méthode de la bibliothèque standard de golang. Ce qui est similaire auvariadic
fonctionnement de la fonction. Nous devons donc utiliser...
la source
append([]int{1,2}, []int{3,4}...)
marchera. Passer des arguments aux...
paramètres.Si
f
est variadique avec un paramètre finalp
de type...T
, alors dansf
le type dep
est équivalent à type[]T
.Si
f
est invoqué sans argument réel pourp
, la valeur passée àp
estnil
.Sinon, la valeur transmise est une nouvelle tranche de type
[]T
avec un nouveau tableau sous-jacent dont les éléments successifs sont les arguments réels, auxquels tous doivent être attribuablesT
. La longueur et la capacité de la tranche sont donc le nombre d'arguments liés àp
et peuvent différer pour chaque site d'appel.Compte tenu de la fonction et des appels
la source