2011-11-07 15 views
20

Czy istnieje wygodny sposób na początkową tablicę bajtów?Konwertuj ciąg do tablicy o stałym rozmiarze bajtów w Go

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: nie można wykorzystywać "B C D E" (typ łańcucha) jako typ [5] Uint8 wartości pola

przypadku zmiany linii do t := T1{[5]byte("abcde"), 3}

prog.go: 8: nie można przekonwertować "abcde" (typ string) na typ [5] uint8

+0

Jest to podobne do: http://stackoverflow.com/questions/8032170/how-to-assign-string-to-bytes-array. – jimt

Odpowiedz

9

Można skopiować ciąg do plasterka tablicy bajtów:

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

Edycja: za pomocą formularza nazwie, T1 przez sugestię dosłownym jimt użytkownika.

+0

W tej metodzie wykonywanie kopii opóźni się w środowisku wykonawczym zamiast w czasie kompilacji. Czy mam rację? –

+0

@DanielYCLin: To prawda. Pokazany tutaj przykład może również obejść się bez bitu [5] byte {} w inicjalizatorze struct. Stałe pole tablicy tablicowej zostało już zainicjowane. Nie ma potrzeby robienia tego dwukrotnie: 't: = T1 {f2: 3}; copy (t.f1 [:], "abcde") '. – jimt

+0

Kopia nie może się zdarzyć w czasie kompilacji w obu przypadkach. W obu przypadkach dane zostaną skopiowane na stos lub do sterty z danych programu. Ponadto, podczas gdy zgodziłbym się, że wskazany formularz jest ładniejszy (rozważałem użycie go, ale zdecydowałem się nie), tablica nie zostanie zainicjalizowana dwukrotnie w kodzie, który opublikowałem. – SteveMcQwark

12

Czy istnieje jakiś szczególny powód, dla którego potrzebujesz tablicy bajtów? W Go lepiej będzie użyć plastra bajtowego.

package main 
import "fmt" 

type T1 struct { 
    f1 []byte 
    f2 int 
} 

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

Wymagam tablicy bajtów, aby przesłać pakiet sieciowy, zapisz moje dane do pliku. –

+2

Jeśli chcesz to zrobić, powinieneś także użyć stałego rozmiaru int (int32, int64). – SteveMcQwark

+0

Dzięki, SteveMcQwark, Zmienię moje pytanie, aby było jaśniejsze. –

Powiązane problemy