为了账号安全,请及时绑定邮箱和手机立即绑定

是否可以存储 Go 类型

是否可以存储 Go 类型

Go
手掌心 2022-01-04 18:48:36
我有一些接口,以及任意实现这些接口的 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 回答

?
噜噜哒

TA贡献1784条经验 获得超7个赞

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

}


查看完整回答
反对 回复 2022-01-04
  • 1 回答
  • 0 关注
  • 151 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信