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

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何將結(jié)構(gòu)轉(zhuǎn)換/轉(zhuǎn)換為 Protobuf?

如何將結(jié)構(gòu)轉(zhuǎn)換/轉(zhuǎn)換為 Protobuf?

Go
人到中年有點(diǎn)甜 2023-07-04 16:45:15
我正在開發(fā)一個個人項(xiàng)目,并且是第一次使用 Go。我使用結(jié)構(gòu)來操作數(shù)據(jù)并將數(shù)據(jù)存儲在文件中,我使用 proto 作為編碼器。在項(xiàng)目中,我的原型定義看起來像這樣message Data {    string key = 1;    string value = 2;}message Record {    int64 size = 1;    Data data = 2;}我的結(jié)構(gòu)看起來像這樣type KVData struct {    Key       string    Value     string}目前,這就是我創(chuàng)建原始數(shù)據(jù)的方式kvData := KVData{Key: "name", Value: "A"}record := &pb.Record{        Size: 20,        Data: &pb.Data{Key: "name", Value: "A"},}我正在尋找一種方法來做到這一點(diǎn):record := &pb.Record{        Size: 20,        Data: &((pb.Data)kvData), // Won't work}// or like Pythonrecord := &pb.Record{        Size: 20,        Data: &(pb.Data{**kvData}), // Won't work}我嘗試谷歌搜索,但找不到任何解釋如何執(zhí)行此操作的解決方案。請注意,我不僅僅是想解決這個特定的情況,我還想知道在結(jié)構(gòu)和原型之間操作的推薦Go方式是什么(僅使用原型?)?
查看完整描述

3 回答

?
鴻蒙傳說

TA貢獻(xiàn)1865條經(jīng)驗(yàn) 獲得超7個贊

你不能,至少在 Go 1.12.7 中不能。


Go 的 Protobuf 編譯器向消息生成的每個結(jié)構(gòu)添加 3 個額外字段:


XXX_NoUnkeyedLiteral         struct{} `json:"-"`

XXX_unrecognized             []byte   `json:"-"`

XXX_sizecache                int32    `json:"-"`

因此,您的struct和生成的字段具有不同的字段并且不相同,因此不可分配。


如果兩個結(jié)構(gòu)僅在標(biāo)簽上不同,則可以將其轉(zhuǎn)換:


type Person struct {

    Name    string

    Address *struct {

        Street string

        City   string

    }

}


var data *struct {

    Name    string `json:"name"`

    Address *struct {

        Street string `json:"street"`

        City   string `json:"city"`

    } `json:"address"`

}


var person = (*Person)(data)  // ignoring tags, the underlying types are identical

您必須struct手動創(chuàng)建一個新實(shí)例。


查看完整回答
反對 回復(fù) 2023-07-04
?
小怪獸愛吃肉

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超1個贊

你能得到的最接近的是這樣的:


pbData := pb.Data(kvData) // convert kvData struct to pb.Data struct


record := &pb.Record{

        Size: 20,

        Data: &pbData,

}

注意:您不能像這樣組合這兩個步驟:


record := &pb.Record{

    Size: 20,

    Data: &(pb.Data(kvData)), // BROKEN: can't get address of a return-value

}

您可以在這里進(jìn)行更多實(shí)驗(yàn):https ://play.golang.org/p/2AhWi0Khe4l


編輯:如果Go 1.8之前的結(jié)構(gòu)類型不完全相同(相同的標(biāo)簽等),則無法轉(zhuǎn)換它們。更新的 Playground 鏈接到演示不匹配的標(biāo)簽將與go 1.8或稍后進(jìn)行轉(zhuǎn)換。


查看完整回答
反對 回復(fù) 2023-07-04
?
叮當(dāng)貓咪

TA貢獻(xiàn)1776條經(jīng)驗(yàn) 獲得超12個贊

您可以使用第三方庫 gogofaster 從 .proto 文件生成 go 代碼。

gogofaster 是一個更快的生成工具,它不包含結(jié)構(gòu)中的額外字段 (XXX_*),從而使轉(zhuǎn)換更簡單(因?yàn)榻Y(jié)構(gòu)現(xiàn)在將是相同的)。

查看完整回答
反對 回復(fù) 2023-07-04
  • 3 回答
  • 0 關(guān)注
  • 520 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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