struct型のすべてのフィールドを調べ、指定されたインタフェースを実装しているかどうかを調べる必要があります。構造体が指定されたインタフェースを実装しているかどうかを確認してください。
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))
}
}
次に、もしそうのような構造体との通話HasModels:当社とユーザーの両方のモデルを実装して
type Company struct {...}
type User struct {
...
Company Company
}
HasModels(&User{})
。 User構造体のCompanyフィールドに対してfalseを返すf.Type.Implements(ModelType)が返されます。
これは予期せぬことです。私はここで間違っていますか?
あなたは正しく推測しています。私はf.Type.Implements(modelType)をreflect.PtrTo(f.Type).Implements(modelType)に変更しました。これは完全に機能します。速い答えのためのThx。 –