为了账号安全,请及时绑定邮箱和手机立即绑定

将值类型浮点的现有字段更改为 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 关注
  • 190 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号