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?
La spécification du langage de programmation Go
La fonction variadique
append
ajoute zéro ou plusieurs valeursx
às
de typeS
, qui doit être un type de tranche, et renvoie la tranche résultante, également de typeS
. Les valeursx
sont passées à un paramètre de type...T
OùT
est le type d'élément deS
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]
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...)