3 回答

TA貢獻(xiàn)1794條經(jīng)驗(yàn) 獲得超8個(gè)贊
您正在尋找來(lái)自 的MarshalTo方法gogo/protobuf
,它是 protobuf 的另一種實(shí)現(xiàn),與原始方法兼容。
當(dāng)您將要填充的緩沖區(qū)傳遞給它時(shí),您可以通過(guò)多個(gè)編組調(diào)用重新使用同一個(gè)緩沖區(qū)。顯然緩沖區(qū)應(yīng)該足夠大。
func?MarshalTo([]byte,?m)?error

TA貢獻(xiàn)1860條經(jīng)驗(yàn) 獲得超9個(gè)贊
似乎你可以Packet.buffer
成為一個(gè)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貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超5個(gè)贊
目前尚不清楚你在問(wèn)什么。請(qǐng)注意,原型 Marshal() 函數(shù)完全符合您的要求:它將消息序列化為字節(jié)切片(您可能指的是字節(jié)數(shù)組)
看看這些是否有幫助:
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 關(guān)注
- 177 瀏覽
添加回答
舉報(bào)