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

为什么has方法不使用protoc 3.17生成。*如果在回购协议中,他们说应该这样做?

陈哲
2023-03-14

阅读这里:https://github.com/protocolbuffers/protobuf/blob/master/docs/field_presence.md#go-exampleGolang例子:

m := GetProto()
if (m.HasFoo()) {
  // Clear the field:
  m.Foo = nil
} else {
  // Field is not present, so set it.
  m.Foo = proto.Int32(1);
}

如果我使用:

protoc pkg/user.proto --go_out=. --go_opt=module=my_app --go-grpc_out=. --go-grpc_opt=module=my_app

与:

syntax = "proto3";

package example;

message MyPlayer {
  uint64 id = 1;
  optional string description = 2;
  uint32 qty = 3;
  optional uint64 age = 4;
}

它不会生成任何具有

为什么?

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
//  protoc-gen-go v1.26.0
//  protoc        v3.17.3

如果我使用MyPlayer生成的原始字段而不是方法,我错了吗?

例子:

if MyPlayer.description != nil {
  description = *MyPlayer.description
}

而不是

description = MyPlayer.GetDescription()

这不是我想要的(我想检测nil值)。


共有1个答案

宋飞掣
2023-03-14

正如这里报道的那样,这些文件是错误的:https://github.com/golang/protobuf/issues/1336:

关于https://github.com/protocolbuffers/protobuf/blob/master/docs/field_presence.md#go-这个例子是不正确的。在proto3中使用“可选”可以像在proto2中一样生成字段。

那个文档是错误的。生成的代码中没有has方法。通过将字段与nil进行比较来测试存在性。

正确重写这些示例:

// Field foo does not have presence.
// If field foo is not 0, set it to 0.
// If field foo is 0, set it to 1.
m := GetProto()
if m.Foo != 0 {
  // "Clear" the field:
  m.Foo = 0
} else {
  // Default value: field may not have been present.
  m.Foo = 1
}
// Field foo has presence.
// If foo is set, clear it.
// If foo is not set, set it to 1.
m := GetProto()
if m.Foo != nil {
  // Clear the field:
  m.Foo = nil
} else {
  // Field is not present, so set it.
  m.Foo = proto.Int32(1)
}

PR修复该文档:协议缓冲区/协议缓冲区#8788

 类似资料:
  • 本文向大家介绍在css中为什么说不建议使用@import?相关面试题,主要包含被问及在css中为什么说不建议使用@import?时的应答技巧和注意事项,需要的朋友参考一下 @import 属于 CSS,所以导入语句应写在 CSS 中,要注意的是导入语句应写在样式表的开头,否则无法正确导入外部文件; @import 是 CSS2.1 才出现的概念,所以如果浏览器版本较低,无法正确导入外部样式文件;

  • 问题内容: 我了解到MySQL可以压缩服务器和客户端之间的通信。 如果客户端和服务器均支持zlib压缩,并且客户端请求压缩,则使用压缩。 (来自MySQL Forge Wiki ) 最明显的利弊是 优点:有效载荷尺寸减小 缺点:增加了计算时间 那么,只要我能负担得起具有足够规格的服务器,就应该启用压缩协议吗?我还要考虑其他因素吗? 问题答案: 除了网络带宽和数据库服务器及其客户端之间的延迟之外,性

  • 问题内容: 我有2个线程T1和T2,两者都有不同的工作,因此通常我们更喜欢通过线程Joins完成此任务。 但是我们无需使用join()就可以做到这一点。我们可以在T1线程中添加T2线程的代码。这有什么区别? 问题答案: 主要区别在于,当我们将T2线程与T1连接在一起时,T2执行该任务的时间也可以由T1占用,这意味着它们将并行执行不同的任务。但是,当您在T1中包含T2线程代码时,不会发生这种情况。线

  • 我对Swift中关于var和关键字{get set}的使用的协议有疑问。 来自Apple文档: 这将不是公正的: 我错过了什么?

  • 问题内容: 我已经继承了代码 读为“ HttpClientBuilder的文档似乎很稀疏,只是说: 但是,如果我用该方法替换仍然出现。 如何使用不推荐使用的方法? 问题答案: 不用创建的新实例,而是使用Builder。你会得到一个。 例如用法: 而不是使用,而是使用方法。

  • HTTP有HTTP cookie。Cookie允许服务器跟踪用户状态、连接数、上次连接等。 HTTP具有持久连接(Keep-Alive),其中可以从同一个TCP连接发送多个请求。