go - 是否可以存储 Go 类型

标签 go go-interface

我有一些接口(interface),以及 n 个任意实现这些接口(interface)的结构。我想保留一个类型数组,并能够对它们运行循环以查看实现了哪些类型。是否可以存储这样的类型?我花了一点时间在反射包上,但无法真正找到我要找的东西,我明白这是否不是最佳实践。尝试做类似的事情.. 没有巨大的类型转换、fallthrough 或 if..if...if.

type InterOne interface {
    InterOneMethod() string
}

var interfaceMap = map[string]type {
    "One": InterOne,
    ...
}

func doesHandle(any interface{}) []string {
    var handles []string
    for k, v := range interfaceMap {
      if _, ok := any.(v); ok {
          handles = append(handles, k)
      }
    }
    return handles
}

编辑:标记为正确的答案在技术上是正确的。我发现由于关于方法调用和过度使用反射的评论,这种方法不是一个好主意。相反,我使用类型切换来检查单个接口(interface),因为类型切换不支持 fallthrough,并且带有类型断言的大型 if..if..if.. 能够进行适当的调用。

最佳答案

你可以使用 reflect,注意获取接口(interface)类型的唯一方法是使用 reflect.TypeOf((*INTERFACE)(nil)).Elem(),这是一个有效的方法示例:

var interfaceMap = map[string]reflect.Type{
    "One": reflect.TypeOf((*InterOne)(nil)).Elem(),
....
}

func doesHandle(any interface{}) []string {
    t := reflect.TypeOf(any)
    var handles []string
    for k, v := range interfaceMap {
        if t.Implements(v) {
            handles = append(handles, k)
        }
    }
    return handles
}

playground

关于go - 是否可以存储 Go 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36684651/

相关文章:

dictionary - append 的第一个参数必须是 slice;有结构 - golang 映射

arrays - 使用一组键拆分对象数组

go - 如何将 nil 接口(interface)转换为 nil 其他接口(interface)

golang 从接口(interface)获取值{}

go - Go堆接口(interface)实现的优先级队列大小限制

go - 或者golang模板中的语句结合gt/lt(greaterThan, lowerThan)

string - 在 Go 中解析格式化字符串

windows - 从 Windows 上的 Go *net.UDPConn 获取 syscall.Handle?

go - 未实现,方法类型错误

go - 来自接口(interface)值的底层指针类型