2011-11-07 11 views
20

¿Hay forma conveniente de inicializar una matriz de bytes?convertir cadena a matriz de bytes de tamaño fijo en Ir

package main 
import "fmt" 
type T1 struct { 
    f1 [5]byte // I use fixed size here for file format or network packet format. 
    f2 int32 
} 
func main() { 
    t := T1{"abcde", 3} 
    // t:= T1{[5]byte{'a','b','c','d','e'}, 3} // work, but ugly 
    fmt.Println(t) 
} 

prog.go: 8: no se puede utilizar (tipo cadena) "abcde" como tipo de [5] uint8 en valor de campo

si cambio de la línea a t := T1{[5]byte("abcde"), 3}

prog.go: 8: no se puede convertir "abcde" (tipo cadena) para escribir [5] uint8

+0

Esto es similar a: http://stackoverflow.com/questions/8032170/how-to-assign-string-to-bytes-array. – jimt

Respuesta

9

Se puede copiar la cadena en una porción de la matriz de bytes:

package main 
import "fmt" 
type T1 struct { 
    f1 [5]byte 
    f2 int 
} 
func main() { 
    t := T1{f2: 3} 
    copy(t.f1[:], "abcde") 
    fmt.Println(t) 
} 

Editar: utilizando el formulario con nombre de T1 literal, por sugerencia de jimt.

+0

En este método, el trabajo de copia se retrasará en el tiempo de ejecución en lugar de en tiempo de compilación. ¿Estoy en lo cierto? –

+0

@DanielYCLin: Eso es correcto. El ejemplo que se muestra aquí también puede funcionar sin el bit '[5] byte {}' en el inicializador de estructuras. Un campo de estructura de matriz fija ya está inicializado. No es necesario hacerlo dos veces: 't: = T1 {f2: 3}; copiar (t.f1 [:], "abcde") '. – jimt

+0

La copia no puede suceder en el momento de la compilación en ninguno de los casos. En ambos casos, los datos se copiarán en la pila o en el montón de los datos del programa. Además, aunque estoy de acuerdo en que el formulario mencionado es más bonito (estaba considerando usarlo, pero decidí no hacerlo), el arreglo no se inicializa dos veces en el código que publiqué. – SteveMcQwark

12

¿Hay alguna razón en particular por la que necesite una matriz de bytes? En Go, será mejor que uses un segmento de bytes en su lugar.

package main 
import "fmt" 

type T1 struct { 
    f1 []byte 
    f2 int 
} 

func main() { 
    t := T1{[]byte("abcde"), 3} 
    fmt.Println(t) 
} 
+3

Necesito una matriz de bytes para hacer la transferencia de paquetes de red, guardar mis datos en un archivo. –

+2

Si desea hacer eso, también debe usar un int de tamaño fijo (int32, int64). – SteveMcQwark

+0

Gracias, SteveMcQwark, he modificado mi pregunta para aclararla. –

Cuestiones relacionadas