How can I convert a structure with a byte slice data type to bytes?
我需要在套接字通信期间发送字节切片数据类型的结构数据。
1 2 3 4 | type A struct { header []byte body []byte } |
所以我写了下面的源代码将结构体转换为字节。
1 2 3 4 5 | 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 函数中遇到错误,显示以下错误:
1 | binary.Write: invalid type main.A |
我发现固定数组可以解决这个问题。但是由于数据的长度是不断变化的,所以我不得不使用切片而不是固定数组。
有没有办法解决这个问题?
如果你写一个可变长度的字节片,另一端将不知道它需要读取多少字节。您也必须传达长度。
因此,发送字节切片的一种方法是首先使用固定大小的类型写入长度(字节数),例如
例如:
1 2 3 4 5 6 7 8 9 | 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 } |
您也可以使用相同的逻辑发送
另一方面,您可以这样阅读:
1 2 3 4 5 6 7 8 9 10 11 | 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 上尝试一个工作示例。
如果您必须传输更复杂的结构,请考虑使用