2011-11-07 104 views
20

初始字節數組有沒有簡便的方法?將字符串轉換爲固定大小的字節數組中的字段

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:不能使用 「ABCDE」(類型字符串)作爲類型[5] UINT8在字段值

如果我行更改爲t := T1{[5]byte("abcde"), 3}

prog.go: 8:不能轉換「abcde」(類型字符串)鍵入[5] uint8

+0

這類似於:http://stackoverflow.com/questions/8032170/how-to-assign-string-to-bytes-array。 – jimt

回答

9

您可以將字符串複製到字節數組的一個切片:

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

編輯:使用T1文字,命名形式通過JIMT的建議。

+0

在這種方法中,複製工作將延遲運行時間而不是編譯時間。我對嗎? –

+0

@DanielYCLin:這是正確的。這裏顯示的例子也可以在struct initializer中沒有'[5] byte {}'位。一個固定的數組結構域已經被初始化。不需要做兩次:'t:= T1 {f2:3};複製(t.f1 [:],「abcde」)'。 – jimt

+0

在這兩種情況下,複製都不會發生在編譯時。在這兩種情況下,數據都將被複制到堆棧或程序數據堆中。另外,儘管我同意命名錶單更好(我正在考慮使用它,但決定不使用),但是在我發佈的代碼中,數組並未初始化兩次。 – SteveMcQwark

12

是否有任何特殊的原因,你需要一個字節數組?在Go中,您最好使用字節片段代替。

package main 
import "fmt" 

type T1 struct { 
    f1 []byte 
    f2 int 
} 

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

我需要字節數組來執行網絡數據包傳輸,將我的數據保存到文件中。 –

+2

如果你想這樣做,你也應該使用一個固定大小的int(int32,int64)。 – SteveMcQwark

+0

謝謝SteveMcQwark,我已經將我的問題修改得更清楚了。 –

相關問題