コンテキスト:
Go では、C をエミュレートしようとすると課題が発生します。 -style 型キャスト操作 (構造体への直接メモリ マッピングなど)。この記事では、そのような変換を実現するために利用できるメソッドについて詳しく説明します。
unsafe.Pointer による型キャスト:
歴史的に、unsafe.Pointer は直接メモリ操作に使用されていました。ただし、明示的な型変換が必要であり、メモリ破損の可能性があるため安全上のリスクが伴います。
<code class="go">import "unsafe" type packet struct { opcode uint16 data [1024]byte } var pkt1 packet ... // Low-level type casting ptr := unsafe.Pointer(&pkt1) raddrPtr := (*uint32)(unsafe.Pointer(uintptr(ptr) + 2))</code>
エンコーディング/バイナリ パッケージ:
これらの懸念に対処するには、エンコーディング/バイナリ パッケージは、より安全で便利なソリューションを提供します。このパッケージを使用すると、リトル エンディアンやビッグ エンディアンなどの事前定義されたエンコーディングを使用して、データの効率的なシリアル化と逆シリアル化が可能になります。
<code class="go">// Encoding and decoding example package main import ( "bytes" "encoding/binary" "fmt" ) type T struct { A uint32 B float64 } func main() { // Create a struct and write it. t := T{A: 0xEEFFEEFF, B: 3.14} buf := &bytes.Buffer{} err := binary.Write(buf, binary.BigEndian, t) if err != nil { panic(err) } fmt.Println(buf.Bytes()) // Read into an empty struct. t = T{} err = binary.Read(buf, binary.BigEndian, &t) if err != nil { panic(err) } fmt.Printf("%x %f", t.A, t.B) }</code>
エンコーディング/バイナリ パッケージを採用することで、データ サイズとエンディアンネスの変換を簡単に処理できます。 、型の安全性を確保し、パフォーマンスを維持します。
以上がGo 構造体とバイト配列の間で変換する方法: 安全で効率的な方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。