第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

可以將 protobuf 編組消息發(fā)送到已分配的字節(jié)數(shù)組而無(wú)需復(fù)制嗎?

可以將 protobuf 編組消息發(fā)送到已分配的字節(jié)數(shù)組而無(wú)需復(fù)制嗎?

Go
慕妹3146593 2023-06-01 15:17:39
我正在通過(guò)自定義數(shù)據(jù)包實(shí)現(xiàn)客戶端服務(wù)器通信。我正在使用圍棋net.conn??梢該芴?hào)tcp/unix schemes,非常方便。我用來(lái)protocol buffer定義我的消息。我定義了一個(gè)包含length和buffertype Packet struct {    length uint32    buffer []byte}API函數(shù)是這樣的:func(api *API) Send(m *proto.Message) errorfunc(api *API) Receive(p *Packet) error以send函數(shù)為例,它接收一個(gè) protobuf 消息,將其編組為Packet. 并將其寫入net.conn.下面是 Send 函數(shù)的簡(jiǎn)化版本: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}我正在復(fù)制bytes到buffer. 因?yàn)?Go protocol buffer API 只提供func Marshal(pb Message) ([]byte, error)在 Protocol Buffer C++ 中,它提供了 bool SerializeToArray(void * data, int size) const,它正在序列化消息并將其存儲(chǔ)在給定的字節(jié)數(shù)組中。但是我在 Go protocol buffer API 中找不到同樣的東西。如果我想直接將序列化結(jié)果存儲(chǔ)在給定的字節(jié)數(shù)組中,有什么辦法可以避免復(fù)制?
查看完整描述

3 回答

?
慕田峪9158850

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


查看完整回答
反對(duì) 回復(fù) 2023-06-01
?
慕碼人2483693

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)


查看完整回答
反對(duì) 回復(fù) 2023-06-01
?
RISEBY

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

}


查看完整回答
反對(duì) 回復(fù) 2023-06-01
  • 3 回答
  • 0 關(guān)注
  • 177 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)