2011-11-07 4 views
20

İlk bayt dizisi için uygun bir yol var mı?Dizeyi sabit boyutlu bayt dizisine git

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: türü olarak "ABCDE" (tip dizesi) [5] alan değeri uint8

I t := T1{[5]byte("abcde"), 3}

prog.go hattı değiştirmek edin: 8: "abcde" (tür dizesi) 'yi [5] türüne dönüştüremiyorum uint8

+0

Bu, şuna benzer: http://stackoverflow.com/questions/8032170/how-to-assign-string-to-bytes-array. – jimt

cevap

9

Sen bayt dizisi bir dilim içine dize kopyalayabilirsiniz:

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

Edit: jimt önerisi ile birebir T1, adlandırılmış formu kullanarak.

+0

Bu yöntemde, kopyalama çalışması derleme zamanı yerine çalışma zamanında ertelenir. Ben haklı mıyım –

+0

@DanielYCLin: Bu doğru. Burada gösterilen örnek, struct başlatıcıdaki '[5] byte {}' biti olmadan da yapabilir. Sabit bir dizi yapı alanı zaten başlatıldı. Bunu iki kez yapmaya gerek yoktur: 't: = T1 {f2: 3}; kopyala (t.f1 [:], "abcde"). – jimt

+0

Kopya, her iki durumda da derleme zamanında gerçekleşemez. Her iki durumda da, veriler program verilerinden yığına veya yığına kopyalanacaktır. Ayrıca, adlandırılan formun daha güzel olduğunu kabul etmeme rağmen (kullanmamaya karar verdim, ama karar vermedim), dizi gönderdiğim kodda iki kez başlatılmıyor. – SteveMcQwark

12

Bayt dizisine gereksinim duymanızın özel bir nedeni var mı? Go'da bunun yerine bir byte dilim kullanarak daha iyi olacaksınız.

package main 
import "fmt" 

type T1 struct { 
    f1 []byte 
    f2 int 
} 

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

Ağ paket aktarımı yapmak için bayt dizisine ihtiyacım var, verilerimi dosyaya kaydet. –

+2

Bunu yapmak isterseniz, sabit boyutlu bir int (int32, int64) kullanmalısınız. – SteveMcQwark

+0

Teşekkürler, SteveMcQwark, sorumu daha net bir şekilde değiştirdim. –