2011-11-07 13 views
20

バイト配列を初期化する便利な方法はありますか?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:私はt := T1{[5]byte("abcde"), 3}

prog.goに行を変更した場合、フィールド値

[5] UINT8タイプとして "ABCDE"(文字列型)を使用することができません。 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) 
} 

編集:使用してJIMTの提案により、T1の形リテラルの名前。

+0

この方法では、コンパイル時間の代わりに実行時にコピー作業が遅れることになります。私は正しい? –

+0

@DanielYCLin:それは正しいです。ここに示した例は、struct initializerの '[5] byte {}'ビットなしでも行うことができます。固定配列構造体フィールドは既に初期化されています。これを2回行う必要はありません: 't:= T1 {f2:3};コピー(t.f1 [:]、 "abcde") '。 – jimt

+0

いずれの場合も、コピーはコンパイル時には発生しません。どちらの場合も、データはスタックにコピーされるか、プログラムデータからヒープにコピーされます。また、私は名前付きフォームがより良い(私はそれを使用することを検討していたが、そうしないことに同意する)一方で、配列は私が投稿したコードで2回初期化されません。 – 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、私は明確に私の質問を変更しました。 –

関連する問題