是否可以存储Go类型

时间:2016-04-18 02:42:47

标签: go go-interface

我有一些接口,以及任意实现这些接口的n个结构。我想保留一系列类型,并能够在它们上面运行循环以查看实现了哪些类型。是否可以存储这样的类型?我花了一点时间使用反射包,但无法找到我想要的东西,我明白这可能不是最佳实践。尝试做类似这样的事情..没有巨型开关,穿透,或者如果......如果。

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
}

编辑:标记为正确的答案在技术上是正确的。我发现由于关于方法调用的评论&过度使用反射,这种方法是一个坏主意。相反,我使用类型开关来检查单个接口,因为类型开关不支持fallthrough,而大型if .. if .. if ..类型断言可以进行适当的调用。

1 个答案:

答案 0 :(得分:2)

您可以使用反射,请注意,获取界面类型的唯一方法是使用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