是否可以存储 Go 类型
Is it possible to store a Go type
我有一些接口,以及 n 个任意实现这些接口的结构。我想保留一个类型数组,并能够 运行 对它们进行循环以查看实现了哪些类型。是否可以存储这样的类型?我花了一点时间在反射包上,但无法真正找到我要找的东西,我明白这是否不是最佳实践。尝试做类似的事情..没有一个巨大的类型开关,fallthrough,或者如果..如果...如果.
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.. 能够进行适当的调用。
你可以使用 reflect,注意获取接口类型的唯一方法是使用 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
}
我有一些接口,以及 n 个任意实现这些接口的结构。我想保留一个类型数组,并能够 运行 对它们进行循环以查看实现了哪些类型。是否可以存储这样的类型?我花了一点时间在反射包上,但无法真正找到我要找的东西,我明白这是否不是最佳实践。尝试做类似的事情..没有一个巨大的类型开关,fallthrough,或者如果..如果...如果.
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.. 能够进行适当的调用。
你可以使用 reflect,注意获取接口类型的唯一方法是使用 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
}