2011-12-11 8 views
16

Recentemente ho provato ad aggiungere due segmenti di array di byte in Go e ho trovato alcuni errori strani. Il mio codice è:Come posso utilizzare Go append con due [] byte slice o matrici?

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) 

E gli errori sono:

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

Quale presa in considerazione la presunta solidità di fette di Go non dovrebbe essere un problema:

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

Cosa sto sbagliando, e come dovrei andare sull'aggiunta di due array di byte?

risposta

27

Appending to and copying slices

La funzione variadic append accoda zero o più valori x-s di tipo S, che deve essere un tipo fetta e restituisce la sezione risultante, anche di tipo S. I valori x vengono passati a un parametro di tipo ...T dove T è il tipo di elemento S e si applicano i rispettivi parametri che passano alle regole .

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

Passing arguments to ... parameters

Se l'argomento finale è assegnabile ad un tipo di sezione []T, può essere superato invariato il valore di un parametro ...T se l'argomento è seguita da ....

Per l'argomento finale è necessario utilizzare []T....

Per esempio,

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) 
} 
4

append() prende una porzione di tipo []T e quindi un numero variabile di valori del tipo di membro della sezione T. In altre parole, se si passa uno []uint8 come slice a append(), allora ogni argomento successivo sarà uno uint8.

La soluzione è utilizzare la sintassi slice... per passare una slice al posto di un argomento varargs. Il codice dovrebbe essere simile

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

e

five:=append(three, four...) 
Problemi correlati