检查结构是否实现了给定的接口

我需要遍历结构类型的所有字段并检查它们是否实现了给定的接口。


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

公司和用户都实现了模型;我得到 f.Type.Implements(ModelType) 为 User 结构的 Company 字段返回 false 。


这是出乎意料的,所以,我在这里做错了什么?


aluckdog
浏览 215回答 2
2回答

倚天杖

有一种更简单的方法不需要反射。例如:type middlewarer interface {Middleware() negroni.Handler}for _, controller := range ctrls {&nbsp; &nbsp; if m, ok := interface{}(controller).(middlewarer); ok {&nbsp; &nbsp; &nbsp; &nbsp; n.Use(m.Middleware())&nbsp; &nbsp; }}仅在实现中间件接口的切片元素中调用 Middleware() 方法。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go