可以动态运行以便用于基于插件的应用程序吗?
在eclipse中,我们可以创建一些Eclipse可以动态运行的插件。
Go会有同样的事情吗?
答案 0 :(得分:22)
我认为这是两个不同的问题:
第一个就是没有:Go程序是静态链接的,这意味着你无法将代码添加到正在运行的程序中。这也意味着你必须编译程序让它集成插件。
幸运的是,您可以像在大多数语言中一样在Go中定义接受插件的程序,而使用接口和快速编译的Go不会使该任务变得困难。
以下是两种可能的方法:
解决方案1:插入主程序中的插件
与Eclipse插件类似,我们可以通过简单地重新编译程序将“插件”集成到主程序存储器中。从这个意义上讲,我们可以说数据库驱动程序是插件。
这可能不像在Java中那么简单,因为您必须重新编译,并且您必须在代码的某些方面导入“插件”(请参阅how it's done for database drivers),但是,考虑到Go关于目录的标准化和导入,使用简单的makefile导入插件并重新编译应用程序似乎很容易处理。
鉴于Go中编译的简易性和速度,以及包结构的标准化,我认为这是一个非常可行的解决方案。
解决方案2:单独处理
Go在沟通和处理异步调用方面特别容易。这意味着您可以基于通过命名管道(或任何网络解决方案)进行的许多流程通信来定义解决方案。请注意,Go中有rpc package。对于大多数程序而言,这可能足够有效,并且主程序将能够启动和停止插件进程。这很可能感觉类似于Eclipse中的内容,具有内存空间保护的额外好处。
来自写过几个Eclipse插件的人的最后一个注释:你不要那么乱;保持简单。
答案 1 :(得分:2)
Go 1.8支持插件(将于2017年2月发布。)
答案 2 :(得分:1)
正如dystroy已经说过的那样,不可能在运行时加载包。
将来(或今天有限制)可能有像go-eval
这样的项目使用此功能,这是“Go的解释器的开头”。
答案 3 :(得分:0)