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

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

將值類型浮點的現有字段更改為 protobuf 消息中的可選浮點數

將值類型浮點的現有字段更改為 protobuf 消息中的可選浮點數

Go
絕地無雙 2022-10-04 17:21:56
我有以下類型的消息message Foo {    string bar = 1;    float baz = 2;}將其轉換為以下內容以在Go中使用是否有任何問題?message Foo {    string bar = 1;    optional float baz = 2;}在這種情況下,棄用和在原型中創建新字段的首選方法是否也是如此?
查看完整描述

3 回答

?
喵喵時光機

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

取決于特定消息在代碼庫中的集成程度 - 含義

  1. 您是否將封送處理的二進制表示形式存儲在數據庫之類的位置

  2. 是使用您正在修改的消息的不同版本的代碼庫的不同部分 - 例如,Android / ios應用程序的舊版本等

重點是,如果您使用消息結構來取消marshal編碼數據,這些數據不是用完全相同的消息結構生成的,那么壞事就會發生。

文檔建議添加新元素以完全規避此類情況。如果這不是你想做的事情,請考慮上述幾點。


查看完整回答
反對 回復 2022-10-04
?
PIPIONE

TA貢獻1829條經驗 獲得超9個贊

我建議你使用在谷歌.protobuf包中定義的浮點值類型。例如:

syntax = "proto3";


import "google/protobuf/wrappers.proto";


message Foo {

  string bar = 1;

  google.protobuf.FloatValue baz = 2;

}

將生成一個 pb 文件,其中包含以下內容:



type Foo struct {

    state         protoimpl.MessageState

    sizeCache     protoimpl.SizeCache

    unknownFields protoimpl.UnknownFields


    Bar string                 `protobuf:"bytes,1,opt,name=bar,proto3" json:"bar,omitempty"`

    Baz *wrapperspb.FloatValue `protobuf:"bytes,2,opt,name=baz,proto3" json:"baz,omitempty"`

}



您可以按如下方式使用:


  f := Foo{

      Bar:           "Bar",

      Baz:           &wrapperspb.FloatValue{Value: float32(3)},

  }


  var floatValue float32 

  if f.Baz != nil {

      floatValue = f.Baz.GetValue()

  }


查看完整回答
反對 回復 2022-10-04
?
茅侃侃

TA貢獻1842條經驗 獲得超22個贊

將使字段成為指針類型。所以在Go生成的代碼中,會變成,這當然不是。optionaloptional float*float32float32


要棄用字段,請使用字段選項:[deprecated = true]


message Foo {

    string bar = 1;

    float baz = 2 [deprecated = true];

}

如果在 protobuf 架構的后續版本中,您實際上從消息中完全刪除了該字段,則可能需要添加 ,其中 是已刪除字段的編號。reserved 22


message Foo {

    string bar = 1;

    reserved 2;

}

這有助于防止其他人或將來的您在位置 2 中添加新字段。如果您有過時的客戶仍然期望位置2,則這與此相關。float


PS:從版本3.15開始支持Proto3中的菲德optional


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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