19

構造体型のすべてのフィールドを調べて、それらが特定のインターフェイスを実装しているかどうかを確認する必要があります。

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{})

Company と User の両方が Model を実装している場合。User 構造体の Company フィールドに対して false を返す f.Type.Implements(ModelType) を取得します。

これは予想外なので、ここで何が間違っているのでしょうか?

4

3 に答える 3