2011-12-11 4 views
16

Recientemente intenté agregar dos segmentos de matriz de bytes en Ir y encontré algunos errores extraños. Mi código es:¿Cómo puedo utilizar Agregar con dos [] bytes de secciones o matrices?

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) 

Y los errores son:

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

que tomado en consideración la supuesta solidez de las rebanadas de Go no debería ser un problema:

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

Lo ¿Estoy haciendo algo mal y cómo debo ir a anexar arreglos de dos bytes?

Respuesta

27

Appending to and copying slices

La función variadic append anexa cero o más valores x-s de tipo S, que debe ser un tipo de sector y devuelve el segmento resultante, también del tipo S. Los valores x se pasan a un parámetro de tipo ...T donde T es el tipo de elemento de S y se aplica el parámetro respectivo que pasa las reglas .

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

Passing arguments to ... parameters

Si el argumento final es asignable a un tipo rebanada []T, puede ser pasada sin cambios como el valor para un parámetro de ...T si el argumento es seguido de ....

Debe usar []T... para el argumento final.

Por ejemplo,

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() toma un segmento del tipo []T, y luego un número variable de valores del tipo del miembro del segmento T. En otras palabras, si pasa un []uint8 como la porción a append(), entonces quiere que cada argumento posterior sea uint8.

La solución a esto es utilizar la sintaxis slice... para pasar una porción en lugar de un argumento varargs. El código debería ser similar

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

y

five:=append(three, four...) 
Cuestiones relacionadas