当前位置: 首页 > 知识库问答 >
问题:

为什么protobuf两个必需/可选字段都接受“default”值,我希望只有“optional”应该

伏砚
2023-03-14

google protobuf允许我编写如下原型代码:

syntax="proto2";
message hello
{
    optional int32 id=1;
    required string str=2[default="abc"];
    optional int32 op=3 [default=15];
}

它可以编译,没问题。我不太明白,对于“可选”字段,当没有指定值时,解码流返回给我默认值,没关系。但是“必需”字段呢,它不能是空的,那么它的“默认”是如何有效的呢?在什么情况下?

共有1个答案

郭浩穰
2023-03-14

“default”值是字段的getter在尚未设置字段时返回的值。当您创建一个新的消息对象时,最初没有设置任何字段,甚至没有设置必需的字段。因此,默认值是如果您立即调用getter,它将返回的值。

诚然,这对必填字段不是特别有用,但似乎没有任何理由禁止它。

 类似资料:
  • 我在我的. proto文件中定义了一个消息消息。它有两个字段,一个必填字段和一个可选字段。 生成Java代码有其关联的,我有它的两个对象 我的问题是: 当我执行oMessage1=oMessage2时,oMessage1的optionalField的值会发生什么变化? 它会消失吗?(因为oMessage2没有)或 它是否保持不变?(因为oMessage1拥有它,所以赋值运算符注意不要用不存在的字段

  • 默认情况下,还可以为函数参数指定值。 但是,这些参数也可以显式传递值。 语法 (Syntax) function_name(param1,{param2= default_value}) { //...... } 例子 (Example) void main() { test_param(123); } void test_param(n1,{s1:12}) {

  • 我有一个客户机-服务器应用程序,其中服务器以protobuf格式将序列化对象传输给客户机,我想注销一个

  • 我的avdl是这样定义的, 但是在事件发布和模式注册之后,我想让<code>street</code>类型也允许<code>null</code>值。我希望更改前后兼容。我该怎么做?在record完成之前定义一个新的名称空间会吗?(https://github.com/ga4gh/ga4gh-schemas/issues/344#unions或https://docs.oracle.com/dat

  • 我正在使用Hibernate JPA运行本机查询并返回结果列表。 我想要获取的结果列表并添加到映射中以供将来处理,但是返回的映射仅包含ResultList中的最后一项。 如何让结果列表在地图中添加多个条目? --编辑-- 预期地图内容: 940 7107877 940 7107664 940 7112778 940 7112479 940 7114678 940 7113504 println输出

  • 我有一个包含三列的Excel文件。每行都是唯一的。有三个组合框对应于这三列。 当第一个组合框中的选项被选中时,我希望第二个组合框填充来自第二列的项目,这些项目对应于第一个组合盒中的选择。即: < code>-亚当|苹果|种子 < code>- Adam | Orange | Peel < code>- Jess |香蕉|果皮 这里第一列有数据Adam, Jess。第一个组合框已经有两个唯一的选项A