gpt4 book ai didi

go - 如何将具有 byte slice 数据类型的结构转换为字节?

转载 作者:行者123 更新时间:2023-12-01 22:45:48 27 4
gpt4 key购买 nike

在套接字通信期间,我需要发送字节 slice 数据类型的结构数据。

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

我发现固定数组解决了这个问题。但是由于数据的长度在不断变化,因此我必须使用 slice 而不是固定的数组。

有办法解决这个问题吗?

最佳答案

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

因此,发送 byte slice 的一种方法是先使用固定大小的类型(例如, int32int64。然后,只需写入 byte slice 。

例如:

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

关于go - 如何将具有 byte slice 数据类型的结构转换为字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60390011/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com