【发布时间】:2020-03-19 17:36:43
【问题描述】:
我正在尝试从一些深度嵌套的结构中提取一些标签。这些结构是从 protobuf 消息生成的,并包含一个 json 标记。
我有一个指向一个结构的指针,该结构可能包含一个结构,其中包含我可能想要的标签。我可以使用该类型进行迭代以获取结构的字段,但是当我遇到一个指针字段时,我如何获取它的值然后递归?
// Struct has hierarchy like this
a := &somepb.UpdateRequest{
Updates: []*somepb.UpdateRequest_Foo{
&somepb.UpdateRequest_Foo{
Id: 1,
Foo: &somepb.FooInfo{
Metadata: &somepb.Metadata{
Name: "Foo",
Description: "Bar",
},
Some: "s",
Things: "o",
Are: "m",
Broken: "e",
Here: "p",
},
},
},
}
// ParseStruct parses struct tags of given object
func ParseStruct(obj interface{}, tag string) {
r := reflect.ValueOf(obj)
if r.Kind() == reflect.Ptr {
obj = r.Elem().Interface()
}
rv := reflect.TypeOf(obj)
for i := 0; i < rv.NumField(); i++ {
f := rv.Field(i)
// This is to avoid getting tags for Metadata itself (from the struct above)
// which is *Metadata, I want the tags for Name and Description
// inside *Metadata instead
if f.Type.Kind() == reflect.Ptr {
value := f.Tag.Get(tag)
if len(value) == 0 {
continue
}
fmt.Println(value)
}
}
}
【问题讨论】:
标签: go struct reflection tags