web-dev-qa-db-fra.com

Comment puis-je utiliser Go append avec deux tranches ou tableaux de [] octets?

J'ai récemment essayé d'ajouter deux tranches de tableau d'octets dans Go et j'ai rencontré quelques erreurs étranges. Mon code est:

one:=make([]byte, 2)
two:=make([]byte, 2)
one[0]=0x00
one[1]=0x01
two[0]=0x02
two[1]=0x03

log.Printf("%X", append(one[:], two[:]))

three:=[]byte{0, 1}
four:=[]byte{2, 3}

five:=append(three, four)

Et les erreurs sont:

cannot use four (type []uint8) as type uint8 in append
cannot use two[:] (type []uint8) as type uint8 in append

Ce qui, compte tenu de la prétendue robustesse des tranches de Go, ne devrait pas poser de problème:

http://code.google.com/p/go-wiki/wiki/SliceTricks

Que fais-je de mal et comment dois-je procéder pour ajouter des tableaux à deux octets?

27
ThePiachu

La spécification du langage de programmation Go

Ajout et copie de tranches

La fonction variadique append ajoute zéro ou plusieurs valeurs x à s de type S, qui doit être un type de tranche, et renvoie la tranche résultante, également de type S. Les valeurs x sont passées à un paramètre de type ...TT est le type d'élément de S et les règles de transmission de paramètres respectives s'appliquent.

append(s S, x ...T) S // T is the element type of S

Passage d'arguments aux paramètres ...

Si l'argument final est attribuable à un type de tranche []T, Il peut être transmis tel quel comme valeur pour un paramètre ...T Si l'argument est suivi de ....


Vous devez utiliser []T... Pour l'argument final.

Pour votre exemple, avec le type de tranche d'argument final []byte, L'argument est suivi de ...,

package main

import "fmt"

func main() {
    one := make([]byte, 2)
    two := make([]byte, 2)
    one[0] = 0x00
    one[1] = 0x01
    two[0] = 0x02
    two[1] = 0x03
    fmt.Println(append(one[:], two[:]...))

    three := []byte{0, 1}
    four := []byte{2, 3}
    five := append(three, four...)
    fmt.Println(five)
}

Aire de jeux: https://play.golang.org/p/2jjXDc8_SWT

Production:

[0 1 2 3]
[0 1 2 3]
43
peterSO

append() prend une tranche de type []T, puis un nombre variable de valeurs du type du membre de tranche T. En d'autres termes, si vous passez un []uint8 Comme tranche à append() alors il veut que chaque argument suivant soit un uint8.

La solution consiste à utiliser la syntaxe slice... Pour passer une tranche à la place d'un argument varargs. Votre code devrait ressembler à

log.Printf("%X", append(one[:], two[:]...))

et

five:=append(three, four...)
5
Lily Ballard