bingoohuang/blog

GO照么:Java那贼样,给个接口就能找出所有实现

Opened this issue · 0 comments

今天,『电子签章业务部』的徐梓郡,小伙子很爱学习,人也挺机灵,他跑到16楼询问我,老黄,GO里能否像Java一样,可以给定一个Interface,找出所有实现该Interface的Types(Struture)呢?

答案有二:

  1. 编码时,Goland就已经提供这种便利了,看看截图,向上箭头表示跳转到其实现的接口,向下箭头表示跳转到接口的所有实现,不用记快捷键啦,点击箭头就行:

    image

  2. 运行时,我的第6感是,应该不行。Java有个叫做CLASSPATH的”一根縢“,所有加载进类路径的,相当于被列了“清单”,然后配合强大的反射机制“顺藤摸瓜”即可。比如Spring就有根据Interface的Type获得所有实现该Interface的所有管理bean列表的API。而在Go的机制中,并没有这么一个类似CLASSPATH的概念存在,而且是,如果一个包没有被引用(import)到(包括匿名引用),那么这个包就不会最终编译到目标可执行文件中。像数据库驱动,就是通过匿名引用,在init函数中事先注册自己。

    image

  3. 但是,我还是隐隐约约感觉,可能存在某种hack的方式(非正规方式,可能在特定版本特定环境有效,未来版本未知环境可能不好使),达到部分目的。谷歌了一下,得到一些线索:

    1. pkgreflect - A Go preprocessor for package scoped reflection 通过预处理的方式得到var Types = map[string]reflect.Type{ ... }
    2. How to discover all package types at runtime?gist,通过一种hack方式(Linux版本)来获得类型列表(待后续验证)