3 回答
TA贡献1794条经验 获得超7个赞
您正在寻找来自 的MarshalTo方法gogo/protobuf
,它是 protobuf 的另一种实现,与原始方法兼容。
当您将要填充的缓冲区传递给它时,您可以通过多个编组调用重新使用同一个缓冲区。显然缓冲区应该足够大。
func MarshalTo([]byte, m) error
TA贡献1860条经验 获得超9个赞
似乎你可以Packet.buffer
成为一个proto.Buffer
type Packet struct {
length uint32
buffer proto.Buffer
}
...
var packet Packet
packet.length = YouLength
packet.buffer = proto.NewBuffer(make([]byte, YouLength))
//Then you can Marshall in Packet directly and it may be reused.
err := packet.Marshal(message)
TA贡献1856条经验 获得超5个赞
目前尚不清楚你在问什么。请注意,原型 Marshal() 函数完全符合您的要求:它将消息序列化为字节切片(您可能指的是字节数组)
看看这些是否有帮助:
func(api *API) Send(m *proto.Message) error {
p := Packet{}
p.buffer, err := proto.Marshal(m)
if err != nil {
return err
}
_, err := api.conn.Write(p.buffer)
if err != nil {
return err
}
return nil
}
或者
func(api *API) Send(m *proto.Message) error {
buffer := api.packet[:length]
buffer, err := proto.Marshal(m)
if err != nil {
return err
}
_, err := api.conn.Write(buffer)
if err != nil {
return err
}
return nil
}
- 3 回答
- 0 关注
- 125 浏览
添加回答
举报