Devo esaminare tutto il campo di un tipo di struct e controllare se implementano una determinata interfaccia.Verificare se struct implementa una determinata interfaccia
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))
}
}
Quindi, se una chiamata HasModels con una struttura in questo modo:
type Company struct {...}
type User struct {
...
Company Company
}
HasModels(&User{})
con l'azienda e l'utente sia attuazione del Modello; Ottengo f.Type.Implements (ModelType) restituendo false per il campo Company della struttura User.
Questo è inaspettato, quindi, cosa sto facendo di sbagliato qui?
stai indovinando giusto. Ho appena modificato f.Type.Implements (modelType) per riflettere.PtrTo (f.Type) .Implements (modelType) e funziona perfettamente. Grazie per la risposta veloce. –