亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

如何將結構轉換/轉換為 Protobuf?

如何將結構轉換/轉換為 Protobuf?

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

3 回答

?
鴻蒙傳說

TA貢獻1865條經驗 獲得超7個贊

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


Go 的 Protobuf 編譯器向消息生成的每個結構添加 3 個額外字段:


XXX_NoUnkeyedLiteral         struct{} `json:"-"`

XXX_unrecognized             []byte   `json:"-"`

XXX_sizecache                int32    `json:"-"`

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


如果兩個結構僅在標簽上不同,則可以將其轉換:


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手動創建一個新實例。


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

TA貢獻1852條經驗 獲得超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

}

您可以在這里進行更多實驗:https ://play.golang.org/p/2AhWi0Khe4l


編輯:如果Go 1.8之前的結構類型不完全相同(相同的標簽等),則無法轉換它們。更新的 Playground 鏈接到演示不匹配的標簽將與go 1.8或稍后進行轉換。


查看完整回答
反對 回復 2023-07-04
?
叮當貓咪

TA貢獻1776條經驗 獲得超12個贊

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

gogofaster 是一個更快的生成工具,它不包含結構中的額外字段 (XXX_*),從而使轉換更簡單(因為結構現在將是相同的)。

查看完整回答
反對 回復 2023-07-04
  • 3 回答
  • 0 關注
  • 497 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號