Concaténer deux tranches en Aller
J'essaie de combiner la tranche [1, 2]
et la tranche [3, 4]
. Comment puis-je faire cela en Aller?
J'ai essayé:
append([]int{1,2}, []int{3,4})
mais j'ai reçu:
cannot use []int literal (type []int) as type int in append
Cependant, la documentation semble indiquer ce qui est possible, ce qui me manque?
slice = append(slice, anotherSlice...)
Vous devez vous connecter pour publier un commentaire.
Ajouter des points après la seconde tranche:
C'est juste comme n'importe quel autre variadic fonction.
append()
un variadic de la fonction, et la...
vous permet de passer plusieurs arguments à une variadic fonction à partir d'une tranche.foo()
exemple ci-dessus, leis
paramètre contient une copie de l'original de la tranche, qui est de dire qu'il a une copie de la lumière-poids de référence pour le même sous-jacent tableau, len et de la pac. Si lefoo
fonction modifie un membre, le changement sera visible sur l'original. Voici une démo. Donc, la seule surcharge être qu'il crée une nouvelle tranche si vous n'avez pas déjà, comme:foo(1, 2, 3, 4, 5)
qui permettra de créer une nouvelle trancheis
tiendra....
sur une tranche existante, il passe simplement qui tranche. Lorsque vous passez des arguments personnels, il les rassemble dans une nouvelle tranche et la passe. Je n'ai pas une connaissance de première main exacte de la mécanique, mais je suppose que cela:foo(1, 2, 3, 4, 5)
et ce:func foo(is ...int) {
juste de sucres à ceci:foo([]int{1, 2, 3, 4, 5})
et ce:func foo(is []int) {
.La réponse à votre question est exemple
s3 := append(s2, s0...)
dans le Aller Langage De Programmation Spécification. Par exemple,a[low : high : max]
) qui précise également le maximum de capacité. Par exemple, la tranchea[0:2:4]
aura une capacité de4
et il ne peut pas être resliced pour inclure des éléments au-delà, même si la sauvegarde de la matrice de a un millier d'éléments de la suite.Rien contre les autres réponses, mais j'ai trouvé la brève explication dans les docs plus facilement compréhensible que les exemples:
Je pense qu'il est important de souligner et de savoir que si la destination de la tranche (slice vous ajoutez à) a une capacité suffisante, l'ajout qui va se passer "en place", par reslicing la destination (reslicing à augmentation sa longueur afin d'être en mesure d'accueillir le appendable éléments).
Cela signifie que si la destination a été créé par le découpage d'un ensemble ou d'une tranche qui comporte des éléments supplémentaires au-delà de la longueur de la tranche obtenue, ils peuvent être écrasés.
Pour démontrer, par exemple:
De sortie (essayez sur la Aller De L'Aire De Jeux):
Nous avons créé une "sauvegarde" de la matrice de
a
avec une longueur10
. Nous créons ensuite lex
destination tranche par tranchage de cettea
tableau,y
tranche est créé à l'aide du composite littérale[]int{3, 4}
. Maintenant, quand on ajoutey
àx
, le résultat est celui attendu[1 2 3 4]
, mais ce qui est surprenant, c'est que la sauvegarde de la matrice dea
changé, parce que la capacité dex
est10
ce qui est suffisant pour ajoutery
, doncx
est resliced qui permettra également d'utiliser le mêmea
la sauvegarde de tableau, etappend()
copie des éléments dey
là.Si vous voulez éviter cela, vous pouvez utiliser un plein de tranche d'expression qui a la forme
qui construit une tranche et contrôle aussi la résultante de la tranche des capacités par la mise à
max - low
.Voir la modification de l'exemple (la seule différence est que nous créons des
x
comme ceci:x = a[:2:2]
:De sortie (essayez sur la Aller De L'Aire De Jeux)
Comme vous pouvez le voir, nous obtenons les mêmes
x
résultat, mais la sauvegarde de la matrice dea
n'a pas changé, parce que la capacité dex
était "seulement"2
(grâce à la pleine tranche expressiona[:2:2]
). Donc pour faire l'ajout d'un nouveau support de tableau est alloué qui peuvent stocker les éléments des deuxx
ety
, qui est distinct dea
.append( ) de la fonction et de la propagation de l'opérateur
Deux tranches peuvent être concaténées à l'aide de
append
méthode dans la norme golang de la bibliothèque. Qui est similaire à lavariadic
fonction de l'opération. Nous avons donc besoin d'utiliser...
append([]int{1,2}, []int{3,4}...)
fonctionne. Passage d'arguments à...
paramètres.Si
f
est variadic avec un paramètre finalp
de type...T
, puis à l'intérieur def
le type dep
est équivalent à type[]T
.Si
f
est appelée sans arguments pourp
, la valeur passée àp
estnil
.Sinon, la valeur transmise est une nouvelle tranche de type
[]T
avec un nouveau sous-jacente tableau dont les éléments successifs sont les arguments, qui doivent tous être assignable àT
. La longueur et la capacité de la tranche est donc le nombre d'arguments liés àp
et peut être différent pour chaque site d'appel.Compte tenu de la fonction et des appels