gpt4 book ai didi

reflection - 检查结构是否实现给定接口(interface)

转载 作者:IT老高 更新时间:2023-10-28 13:08:42 25 4
gpt4 key购买 nike

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

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;我得到 f.Type.Implements(ModelType) 为 User 结构的 Company 字段返回 false。

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

最佳答案

不幸的是,您遗漏了基本部分(请始终发布完整的程序),所以我只能猜测问题出在指针接收器上定义的方法中,在这种情况下,您的代码的行为 预期。检查此示例及其输出:

package main

import (
"fmt"
"reflect"
)

type Model interface {
m()
}

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 -> %t\n", i, f.Name, f.Type, f.Type.Implements(modelType))
}
}

type Company struct{}

func (Company) m() {}

type Department struct{}

func (*Department) m() {}

type User struct {
CompanyA Company
CompanyB *Company
DepartmentA Department
DepartmentB *Department
}

func (User) m() {}

func main() {
HasModels(&User{})
}

Playground


输出:

0: CompanyA main.Company -> true
1: CompanyB *main.Company -> true
2: DepartmentA main.Department -> false
3: DepartmentB *main.Department -> true

关于reflection - 检查结构是否实现给定接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18570391/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com