【发布时间】:2017-12-03 23:05:45
【问题描述】:
我试图递归地反映一个结构,打印出每个字段的类型。在字段是结构切片的情况下,我希望能够 识别数组中保存的类型,然后反映该类型。
这是一些示例代码
package main
import (
"log"
"reflect"
)
type child struct {
Name *string
Age int
}
type Parent struct {
Name string
Surname *string
Children []*child
PetNames []string
}
func main() {
typ := reflect.TypeOf(Parent{})
log.Printf("This is a : %s", typ.Kind())
for i := 0; i < typ.NumField(); i++ {
p := typ.Field(i)
if !p.Anonymous {
switch p.Type.Kind() {
case reflect.Ptr:
log.Printf("Ptr: %s is a type %s", p.Name, p.Type)
case reflect.Slice:
log.Printf("Slice: %s is a type %s", p.Name, p.Type)
subtyp := p.Type.Elem()
if subtyp.Kind() == reflect.Ptr {
subtyp = subtyp.Elem()
}
log.Printf("\tDereferenced Type%s", subtyp)
default:
log.Printf("Default: %s is a type %s", p.Name, p.Type)
}
}
}
}
输出如下所示:
This is a : struct
Default: Name is a type string
Ptr: Surname is a type *string
Slice: Children is a type []*main.child
Dereferenced Type main.child
Slice: PetNames is a type []string
Dereferenced Type string
当我确定一个字段类型是一个指针切片时,我可以通过调用 subtype.Elem() 来推断类型。
输出是'main.child'
如果我然后尝试使用来反映孩子
subSubType := reflect.TypeOf(subtyp)
log.Printf("%+v", subSubType)
我得到以下信息:
*reflect.rtype
如何使用反射 API 来迭代子结构的字段?
【问题讨论】:
-
不要调用
reflect.TypeOf(subtyp),subtyp已经是reflect.Type类型。 -
play.golang.org/p/Th0uGACjwH 这只是一个例子,我不喜欢我处理字段名称的方式,但是这里已经很晚了,所以希望这会为您指明正确的方向。
标签: go reflection