2011-11-07 68 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,我已经将我的问题修改得更清楚了。 –

相关问题