Ich versuche rekursiv über eine Struktur zu reflektieren, die Art der einzelnen Felder auszudrucken. Wo ein Feld ein Stück von Strukturen ist, würde ich gerne identifizieren den Typ im Array gehalten und dann über diesen Typ reflektieren.Golan recurisive Reflexion
Hier ist ein Beispielcode
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)
}
}
}
}
Die Ausgabe sieht wie folgt aus:
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
Wenn ich erkennen, dass ein Feldtyp eine Scheibe Zeiger ist, ich bin in der Lage zu folge dem Typ durch Aufrufen von subtype.Elem().
Der Ausgang ist 'main.child'
Wenn ich dann versuchen, Kind zu reflektieren mit
subSubType := reflect.TypeOf(subtyp)
log.Printf("%+v", subSubType)
ich folgendes:
*reflect.rtype
Wie kann ich die Reflection-API verwenden über die Felder der Child-Struktur iterieren?
Rufen Sie nicht 'reflect.TypeOf (Subtyp)' , 'Subtyp' ist bereits vom Typ' reflect.Type'. – mkopriva
https://play.golang.org/p/Th0uGACjwH das ist nur ein Beispiel, ich mag nicht die Art, wie ich mit den Feldnamen umgehe, aber es wird langsam spät, also wird dich das hoffentlich nach rechts bringen Richtung. – mkopriva