【问题标题】:How can I convert a structure with a byte slice data type to bytes?如何将具有字节切片数据类型的结构转换为字节?
【发布时间】:2020-06-08 21:57:44
【问题描述】:

socket通信时需要发送字节切片数据类型的struct数据。

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

我发现固定数组可以解决这个问题。但是由于数据的长度是不断变化的,所以我不得不使用切片而不是固定数组。

有没有办法解决这个问题?

【问题讨论】:

    标签: go serialization slice


    【解决方案1】:

    如果你写一个可变长度的字节片,另一端将不知道它需要读取多少字节。您也必须传达长度。

    因此,发送字节切片的一种方法是首先使用固定大小的类型写入长度(字节数),例如int32int64。然后简单地写字节片。

    例如:

    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,它可以轻松处理发送切片。有关示例和一些见解,请参阅Efficient Go serialization of struct to disk

    【讨论】:

    • 帮助很大。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    • 2015-06-05
    • 2011-02-11
    • 2017-09-21
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多