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 關注
- 169 瀏覽
添加回答
舉報