我试图在结构上递归反映,打印出每个字段的类型。如果一块土地是一块结构,我希望能够 识别数组中保存的类型,然后反映该类型。
这是一些示例代码
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()来推断该类型。
输出是&#39; main.child&#39;
如果我尝试使用
反映孩子subSubType := reflect.TypeOf(subtyp)
log.Printf("%+v", subSubType)
我得到以下内容:
*reflect.rtype
如何使用反射API迭代子结构的字段?
答案 0 :(得分:1)
这是一种方法。
for(var i = 0; i < penguinCount.length; i++) {
var penguin = document.createElement("penguin");
penguin.style.backgroundImage = "url('penguin'" + Math.ceil(Math.random() * 8) + "'.png')";
}
Parent {}的输出给出以下类型:
func printType(prefix string, t reflect.Type, visited map[reflect.Type]bool) {
// Print the name of this type with opening ( for description.
fmt.Printf("%s (", t)
// Traverse elements, adding to description as we go.
elems:
for {
switch t.Kind() {
case reflect.Ptr:
fmt.Print("ptr to ")
case reflect.Slice:
fmt.Print("slice of ")
case reflect.Array:
fmt.Printf("array with %d elements of ", t.Len())
default:
break elems
}
t = t.Elem()
}
// Print the kind of the type and the closing ) of the description.
// In the case of a struct, we print the names of the fields and recurse.
switch t.Kind() {
case reflect.Struct:
fmt.Printf("struct with %d fields)\n", t.NumField())
if visited[t] {
// Don't blow up on recursive type definition.
break
}
visited[t] = true
prefix += " "
for i := 0; i < t.NumField(); i++ {
f := t.Field(i)
fmt.Print(prefix, f.Name, " ")
printType(prefix, f.Type, visited)
}
default:
fmt.Printf("%s)\n", t.Kind())
}
}
func main() {
printType("", reflect.TypeOf(Parent{}), make(map[reflect.Type]bool))
}
是:
type child struct {
Name *string
Age int
}
type Parent struct {
Name string
Surname *string
Children []*child
PetNames []string
Parents [2]*Parent
child
}