如何获取FieldOption的值

huangapple go评论97阅读模式
英文:

How to retrieve FieldOption value

问题

我有一个proto文件:

  1. extend google.protobuf.FieldOptions {
  2. string foo_option = 50000;
  3. }
  4. message Request {
  5. // 所有字段都有foo_option
  6. string str1 = 1 [(foo_option) = "bar1"];
  7. string str2 = 1 [(foo_option) = "bar2"];
  8. }

在Go语言中,如果给定 req *Request,我该如何获取每个字段的 foo_option 值呢?

英文:

I have proto:

  1. extend google.protobuf.FieldOptions {
  2. string foo_option = 50000;
  3. }
  4. message Request {
  5. // all fields have foo_option
  6. string str1 = 1 [(foo_option) = "bar1"];
  7. string str2 = 1 [(foo_option) = "bar2"];
  8. }

In Go, given req *Request, how do I retrieve the values of foo_option of each field?

答案1

得分: 3

protoreflect.FieldDescriptor中使用Options()方法。

您需要进行一些类型断言来检索实际的选项值。完整的代码片段可能如下所示:

  1. // 导入
  2. // "google.golang.org/protobuf/proto"
  3. // "google.golang.org/protobuf/reflect/protoreflect"
  4. // "google.golang.org/protobuf/types/descriptorpb"
  5. p := msg.ProtoReflect()
  6. p.Range(func(fd protoreflect.FieldDescriptor, value protoreflect.Value) bool {
  7. opts := fd.Options().(*descriptorpb.FieldOptions)
  8. s, _ := proto.GetExtension(opts, mypbpkg.E_FooOption)
  9. fmt.Println(*s.(*string)) // bar1
  10. return true
  11. })
英文:

From a protoreflect.FieldDescriptor, use Options() method.

You will need a few type assertions to retrieve the actual option value. The full snippet might be like this:

  1. // imports
  2. // "google.golang.org/protobuf/proto"
  3. // "google.golang.org/protobuf/reflect/protoreflect"
  4. // "google.golang.org/protobuf/types/descriptorpb"
  5. p := msg.ProtoReflect()
  6. p.Range(func(fd protoreflect.FieldDescriptor, value protoreflect.Value) bool {
  7. opts := fd.Options().(*descriptorpb.FieldOptions)
  8. s, _ := proto.GetExtension(opts, mypbpkg.E_FooOption)
  9. fmt.Println(*s.(*string)) // bar1
  10. return true
  11. })

huangapple
  • 本文由 发表于 2021年9月24日 16:15:42
  • 转载请务必保留本文链接:https://go.coder-hub.com/69311708.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定