3 回答

TA貢獻1846條經(jīng)驗 獲得超7個贊
取決于特定消息在代碼庫中的集成程度 - 含義
您是否將封送處理的二進制表示形式存儲在數(shù)據(jù)庫之類的位置
是使用您正在修改的消息的不同版本的代碼庫的不同部分 - 例如,Android / ios應(yīng)用程序的舊版本等
重點是,如果您使用消息結(jié)構(gòu)來取消marshal編碼數(shù)據(jù),這些數(shù)據(jù)不是用完全相同的消息結(jié)構(gòu)生成的,那么壞事就會發(fā)生。
文檔建議添加新元素以完全規(guī)避此類情況。如果這不是你想做的事情,請考慮上述幾點。

TA貢獻1829條經(jīng)驗 獲得超9個贊
我建議你使用在谷歌.protobuf包中定義的浮點值類型。例如:
syntax = "proto3";
import "google/protobuf/wrappers.proto";
message Foo {
string bar = 1;
google.protobuf.FloatValue baz = 2;
}
將生成一個 pb 文件,其中包含以下內(nèi)容:
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()
}

TA貢獻1842條經(jīng)驗 獲得超22個贊
將使字段成為指針類型。所以在Go生成的代碼中,會變成,這當(dāng)然不是。optionaloptional float*float32float32
要棄用字段,請使用字段選項:[deprecated = true]
message Foo {
string bar = 1;
float baz = 2 [deprecated = true];
}
如果在 protobuf 架構(gòu)的后續(xù)版本中,您實際上從消息中完全刪除了該字段,則可能需要添加 ,其中 是已刪除字段的編號。reserved 22
message Foo {
string bar = 1;
reserved 2;
}
這有助于防止其他人或?qū)淼哪谖恢?2 中添加新字段。如果您有過時的客戶仍然期望位置2,則這與此相關(guān)。float
PS:從版本3.15開始支持Proto3中的菲德optional
- 3 回答
- 0 關(guān)注
- 186 瀏覽
添加回答
舉報