如何获取FieldOption的值

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

How to retrieve FieldOption value

问题

我有一个proto文件:

extend google.protobuf.FieldOptions {
  string foo_option = 50000;
}

message Request {
  // 所有字段都有foo_option
  string str1 = 1 [(foo_option) = "bar1"];
  string str2 = 1 [(foo_option) = "bar2"];
}

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

英文:

I have proto:

extend google.protobuf.FieldOptions {
  string foo_option = 50000;
}


message Request {
  // all fields have foo_option
  string str1 = 1 [(foo_option) = "bar1"];
  string str2 = 1 [(foo_option) = "bar2"];
}

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

答案1

得分: 3

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

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

// 导入
// "google.golang.org/protobuf/proto"
// "google.golang.org/protobuf/reflect/protoreflect"
// "google.golang.org/protobuf/types/descriptorpb"

p := msg.ProtoReflect()
p.Range(func(fd protoreflect.FieldDescriptor, value protoreflect.Value) bool {
	opts := fd.Options().(*descriptorpb.FieldOptions)
	s, _ := proto.GetExtension(opts, mypbpkg.E_FooOption)
	fmt.Println(*s.(*string)) // bar1
	return true
})
英文:

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:

// imports
// "google.golang.org/protobuf/proto"
// "google.golang.org/protobuf/reflect/protoreflect"
// "google.golang.org/protobuf/types/descriptorpb"

	p := msg.ProtoReflect()
	p.Range(func(fd protoreflect.FieldDescriptor, value protoreflect.Value) bool {
		opts := fd.Options().(*descriptorpb.FieldOptions)
		s, _ := proto.GetExtension(opts, mypbpkg.E_FooOption)
		fmt.Println(*s.(*string)) // bar1
		return true
	})

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:

确定