3 回答

TA贡献1846条经验 获得超7个赞
取决于特定消息在代码库中的集成程度 - 含义
您是否将封送处理的二进制表示形式存储在数据库之类的位置
是使用您正在修改的消息的不同版本的代码库的不同部分 - 例如,Android / ios应用程序的旧版本等
重点是,如果您使用消息结构来取消marshal编码数据,这些数据不是用完全相同的消息结构生成的,那么坏事就会发生。
文档建议添加新元素以完全规避此类情况。如果这不是你想做的事情,请考虑上述几点。

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()
}

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
- 3 回答
- 0 关注
- 190 浏览
添加回答
举报