我在套接字通信期间需要发送字节切片数据类型的结构数据。
type A struct {
header []byte
body []byte
}
所以我编写了以下源代码,将结构转换为字节。
var a A
a.header = byte slice data...
a.body = byte slice data...
buf := new(bytes.Buffer)
binary.Write(buf, binary.BigEndian, a)
但是,binary.Write函数出现错误,显示以下错误:
binary.Write: invalid type main.A
在Internet上,我发现固定阵列解决了这个问题。
但是由于数据长度在不断变化,因此我必须使用切片而不是固定数组。
是否有解决此问题的方法?
如果编写可变长度的字节片,另一端将不知道需要读取多少字节。您也必须传达长度。
因此,发送字节片的一种方法是先使用固定大小的类型(例如, int32
或int64
。然后只需编写字节片。
例如:
var w io.Writer // This represents your connection
var a A
if err := binary.Write(w, binary.LittleEndian, int32(len(a.header))); err != nil {
// Handle error
}
if _, err := w.Write(a.header); err != nil {
// Handle error
}
您也可以使用相同的逻辑发送a.body
。
另一方面,这是您可以阅读的方式:
var r io.Reader // This represents your connection
var a A
var size int32
if err := binary.Read(r, binary.LittleEndian, &size); err != nil {
// Handle error
}
a.header = make([]byte, size)
if _, err := io.ReadFull(r, a.header); err != nil {
// Handle error
}
在Go Playground上尝试工作示例。
如果必须传输更复杂的结构,请考虑使用encoding/gob
,它可以轻松处理发送片段。有关示例和一些见解,请参见encoding/gob
。