将值类型浮点的现有字段更改为 protobuf 消息中的可选浮点数

我有以下类型的消息


message Foo {

    string bar = 1;

    float baz = 2;

}

将其转换为以下内容以在Go中使用是否有任何问题?



message Foo {

    string bar = 1;

    optional float baz = 2;

}

在这种情况下,弃用和在原型中创建新字段的首选方法是否也是如此?


绝地无双
浏览 191回答 3
3回答

喵喵时光机

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

PIPIONE

我建议你使用在谷歌.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()  }

茅侃侃

将使字段成为指针类型。所以在Go生成的代码中,会变成,这当然不是。optionaloptional float*float32float32要弃用字段,请使用字段选项:[deprecated = true]message Foo {    string bar = 1;    float baz = 2 [deprecated = true];}如果在 protobuf 架构的后续版本中,您实际上从消息中完全删除了该字段,则可能需要添加 ,其中 是已删除字段的编号。reserved 22message Foo {    string bar = 1;    reserved 2;}这有助于防止其他人或将来的您在位置 2 中添加新字段。如果您有过时的客户仍然期望位置2,则这与此相关。floatPS:从版本3.15开始支持Proto3中的菲德optional
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go