把結構體當二進制流傳輸是做協議的時候經常用到的功能。要做結構體與字節數組的轉換,在C語言中只要做個指針類型的強制轉換就行了。Go語言里也是有指針的,但是沒有C的指針那么自由,默認的不能做任意類型轉換。Go語言提供更安全的方式。最簡單有效的是使用Gob庫,另外,也可以使用encoding/binary把字節串轉換成結構體。下面是一個使用的例子:
package main
import (
"fmt"
"bytes"
"encoding/binary"
)
func main() {
buf : = new(bytes.Buffer)
var data = [] interface{}{
uint16( 61374),
int8( - 54),
uint8( 254),
}
for _, v : = range data {
err : = binary.Write(buf, binary.LittleEndian, v)
if err != nil {
fmt.Println( "binary.Write failed:", err)
}
}
fmt.Printf( "%x", buf.Bytes())
}
用指針轉換
import (
"fmt"
"bytes"
"encoding/binary"
)
func main() {
buf : = new(bytes.Buffer)
var data = [] interface{}{
uint16( 61374),
int8( - 54),
uint8( 254),
}
for _, v : = range data {
err : = binary.Write(buf, binary.LittleEndian, v)
if err != nil {
fmt.Println( "binary.Write failed:", err)
}
}
fmt.Printf( "%x", buf.Bytes())
}
當然,結構體和字符串有同樣的內存結構,也能進行指針轉換,雖然這比較容量出錯。
package main
import ( "unsafe"; "fmt")
func main() {
var a uint = 0xbeefcafe
fmt.Println( *( * byte)( unsafe.Pointer( &a)))
}
import ( "unsafe"; "fmt")
func main() {
var a uint = 0xbeefcafe
fmt.Println( *( * byte)( unsafe.Pointer( &a)))
}