go - 如何将具有字节切片数据类型的结构转换为字节?
问题描述
我需要在套接字通信期间发送具有字节切片数据类型的结构数据。
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
我发现固定数组解决了这个问题。但是由于数据的长度是不断变化的,所以我不得不使用切片而不是固定数组。
有没有办法解决这个问题?
解决方案
如果你写一个可变长度的字节片,另一端将不知道它需要读取多少字节。你也必须传达长度。
因此,发送字节切片的一种方法是首先使用固定大小的类型写入长度(字节数),例如int32
or 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
which 处理轻松发送切片。有关示例和一些见解,请参阅Efficient Go serialization of struct to disk。
推荐阅读
- sql-server - 无法显式定义表
- python - 通过对象图了解 Python 日志记录
- visual-studio-2017 - 解决 Visual Studio 2017 的依赖问题
- java - 将多个字节数组转换为单个 Java 对象的最佳方法?
- spring-boot - 为 Spring Boot 应用程序创建了 Docker 映像,无法访问
- sql - 复合主键是否也为每一列分别创建索引?
- c# - 服务器应用程序中的并行处理
- bash - 用于创建和删除文件 N 次的 Bash 脚本
- python - xlsx 通过锁定单元格值进行写保护
- typescript - 使用捆绑程序时,Lambda 函数不会自动设置 aws-sdk 凭证