gpt4 book ai didi

go - 可以将 protobuf 编码消息发送到已分配的字节数组而无需复制吗?

转载 作者:IT王子 更新时间:2023-10-29 02:19:51 28 4
gpt4 key购买 nike

我正在通过自定义数据包实现客户端服务器通信。我正在使用 Go net.conn。可以拨号tcp/unix schemes,非常方便。我使用 protocol buffer 来定义我的消息。

我定义了一个包,其中包含lengthbuffer

type Packet struct {
length uint32
buffer []byte
}

API函数是这样的:
func(api *API) Send(m *proto.Message) 错误
func(api *API) Receive(p *Packet) 错误

send函数为例,它接收一个protobuf消息,将其编码成Packet。并将其写入net.conn

这是 Send 函数的简化版本:

func(api *API) Send(m *proto.Message) error {
bytes, err := proto.Marshal(m)
if err != nil {
return err
}
buffer := api.packet[:length]
copy(buffer, bytes)
_, err := api.conn.Write(buffer)
if err != nil {
return err
}
return nil
}

我正在将 bytes 复制到 buffer 中。因为 Go protocol buffer API 只提供
func Marshal(pb Message) ([]byte, 错误)

在protocol buffer C++中,它提供bool SerializeToArray(void * data, int size) const,它正在序列化消息并将其存储在给定的字节数组中。但是我在 Go protocol buffer API 中找不到相同的东西。

如果我想直接将序列化结果存储在给定的字节数组中,有什么办法可以避免复制?

最佳答案

您正在寻找 MarshalTo来自 gogo/protobuf 的方法,protobuf 的另一个实现,与原始版本兼容。

当您将要填充的缓冲区传递给它时,您可以通过多次编码调用重新使用同一个缓冲区。显然缓冲区应该足够大。

func MarshalTo([]byte, m) error 

关于go - 可以将 protobuf 编码消息发送到已分配的字节数组而无需复制吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54203692/

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