pluginloader
pluginloader copied to clipboard
关于plugin调用
首先,简单看了源码是基于go plugin实现的;go plugin目前只能再main package中使用;所以具体项目中是否可以在非 main package中import "github.com/rocket049/pluginloader"待测试;
其次, go 的plugin机制是基于cgo(原理可以参考动态链接库)的.so实现,对plugin的使用是通过load plugin中的符号表(go symbols实现的,理论上每load一次plugin应用内存会增加(增加多少视plugin中符号表的大小而定);
然后,对于plugin中结构体的function、attr的使用可以理解为对普通package的调用,只能访问、修改公有属性和方法;
另外在实现抽象terface{}的各个struct的使用时必须类型断言比如B,C都实现了interface A{},但是C在plugin中,A类型传递给C时需要类型断言:A.(C);
最后,go 的plugin只支持加载不支持“卸载”。so sad!
总之,没有大家想象的灵活,并且关于对插件如何进行管理更是充满玄学气息。