GO照么:Java那贼样,给个接口就能找出所有实现
Opened this issue · 0 comments
bingoohuang commented
今天,『电子签章业务部』的徐梓郡,小伙子很爱学习,人也挺机灵,他跑到16楼询问我,老黄,GO里能否像Java一样,可以给定一个Interface,找出所有实现该Interface的Types(Struture)呢?
答案有二:
-
编码时,Goland就已经提供这种便利了,看看截图,向上箭头表示跳转到其实现的接口,向下箭头表示跳转到接口的所有实现,不用记快捷键啦,点击箭头就行:
-
运行时,我的第6感是,应该不行。Java有个叫做CLASSPATH的”一根縢“,所有加载进类路径的,相当于被列了“清单”,然后配合强大的反射机制“顺藤摸瓜”即可。比如Spring就有根据Interface的Type获得所有实现该Interface的所有管理bean列表的API。而在Go的机制中,并没有这么一个类似CLASSPATH的概念存在,而且是,如果一个包没有被引用(import)到(包括匿名引用),那么这个包就不会最终编译到目标可执行文件中。像数据库驱动,就是通过匿名引用,在init函数中事先注册自己。
-
但是,我还是隐隐约约感觉,可能存在某种hack的方式(非正规方式,可能在特定版本特定环境有效,未来版本未知环境可能不好使),达到部分目的。谷歌了一下,得到一些线索:
- pkgreflect - A Go preprocessor for package scoped reflection 通过预处理的方式得到
var Types = map[string]reflect.Type{ ... }
- How to discover all package types at runtime?, gist,通过一种hack方式(Linux版本)来获得类型列表(待后续验证)
- pkgreflect - A Go preprocessor for package scoped reflection 通过预处理的方式得到