如何在Go中获取protobuf自定义FieldOption扩展的foo_option值
Go语言获取Protobuf自定义字段选项的实现方法
首先注意你提供的proto定义存在语法错误:Request消息中的str1和str2字段编号均为1,protobuf要求同一消息内字段编号必须唯一,实际使用需要调整为不重复的值(比如str2 = 2),否则无法正常生成代码。
具体获取步骤如下:
- 首先确认protoc生成的Go代码中,已经导出了你自定义扩展对应的全局变量,通常命名为
E_FooOption,可以直接在生成的*.pb.go文件中搜索foo_option确认变量名。 - 使用protobuf官方提供的反射API读取字段选项,再从中提取自定义扩展的值。
完整代码示例:
import ( "google.golang.org/protobuf/proto" "google.golang.org/protobuf/reflect/protoreflect" ) // GetAllFooOption 遍历Request所有字段,返回字段名对应foo_option值的映射 func GetAllFooOption(req *Request) map[string]string { result := make(map[string]string) // 获取消息的反射描述对象 msgDesc := req.ProtoReflect().Descriptor() fields := msgDesc.Fields() for i := 0; i < fields.Len(); i++ { field := fields.Get(i) // 获取字段的Options配置 fieldOpts := field.Options() // 读取自定义扩展的值 val, err := proto.GetExtension(fieldOpts, E_FooOption) if err != nil { // 字段未配置foo_option的情况可自行处理,此处直接跳过 continue } result[string(field.Name())] = val.(string) } return result }
如果只需要获取单个指定字段的foo_option,可以跳过遍历,直接按名称获取字段描述:
func GetStr1FooOption(req *Request) string { msgDesc := req.ProtoReflect().Descriptor() str1Field := msgDesc.Fields().ByName("str1") val, err := proto.GetExtension(str1Field.Options(), E_FooOption) if err != nil { return "" } return val.(string) }
内容的提问来源于stack exchange,提问作者onepiece
相关产品推荐
相关产品推荐

