我正在通过自定义数据包实现客户端服务器通信。我正在使用围棋net.conn。可以拨号tcp/unix schemes,非常方便。我用来protocol buffer定义我的消息。
我定义了一个包含length和buffer
type Packet struct {
length uint32
buffer []byte
}
API函数是这样的:
func(api *API) Send(m *proto.Message) error
func(api *API) Receive(p *Packet) error
以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, error)
在 Protocol Buffer C++ 中,它提供了 bool SerializeToArray(void * data, int size) const,它正在序列化消息并将其存储在给定的字节数组中。但是我在 Go protocol buffer API 中找不到同样的东西。
如果我想直接将序列化结果存储在给定的字节数组中,有什么办法可以避免复制?
慕田峪9158850
慕码人2483693
RISEBY
相关分类