Ich muss durch alle Felder eines Strukturtyps gehen und prüfen, ob sie eine bestimmte Schnittstelle implementieren.Prüfe, ob struct eine gegebene Schnittstelle implementiert
type Model interface {...}
func HasModels(m Model) {
s := reflect.ValueOf(m).Elem()
t := s.Type()
modelType := reflect.TypeOf((*Model)(nil)).Elem()
for i := 0; i < s.NumField(); i++ {
f := t.Field(i)
fmt.Printf("%d: %s %s -> %s\n", i, f.Name, f.Type, f.Type.Implements(modelType))
}
}
Wenn dann ein Anruf HasModels mit einer Struktur wie folgt:
type Company struct {...}
type User struct {
...
Company Company
}
HasModels(&User{})
Mit Unternehmen und Benutzer beide Modell implementiert; Ich bekomme f.Type.Implements (ModelType), die für das Company-Feld der User-Struktur false zurückgibt.
Das ist unerwartet, was mache ich hier falsch?
Sie raten richtig. Ich habe gerade f.Type.Implements (modelType) zu reflect.PtrTo (f.Type) .Implements (modelType) geändert und es funktioniert perfekt. Danke für die schnelle Antwort. –