一尘不染

是否可以动态加载Go代码?

go

如标题所述,我想基于仅在运行时可用的信息来动态加载(或不)动态加载Go软件包。

目的是允许用户通过添加新的本机脚本命令的自定义程序包扩展程序。当前,每次我添加新命令或禁止使用某些命令时,都需要编辑程序并重新编译,而如果我可以制作某种dll之类的文件,则可以创建一个“导入”脚本命令来搜索和加载命名命令库。

出于好奇,该程序是基于定制命令的脚本库,我将其用于各种用途。

我提前进行了一些搜索,结果看起来不太好,但是我找不到明确的答案。


阅读 1074

收藏
2020-07-02

共1个答案

一尘不染

Go还不支持动态库。Elias Naur最近发布了一些修补程序,但尚未对其进行审核,并且不太可能将它们包含在Go
1.2中。您可以阅读有关Google网上论坛的讨论:

据我所知,这是关于该主题的最新讨论。

但是,还有另一种方法。您可以在单独的过程中启动插件,并使用net /
rpc
包与您的主应用程序通信。这也使您可以动态地启动/停止/重新编译单独的插件,并且它的优点是不良的插件不会使您的程序崩溃。Go擅长网络通信,您只需充分利用它即可。

我需要编辑程序并重新编译,

您也可以考虑编写一个小的脚本,该脚本监视当前目录中的更改(使用fsnotify),并执行“执行构建”操作,然后重新启动程序。在本地开发期间,我在某些Web项目中使用了这种方法,并且效果很好。我看不到任何编译时间,并且在切换和刷新浏览器窗口时非常快。与Go相比,我的Python开发周期必须重新启动解释器,并且每次更改都必须重新导入所有模块(在大型项目中可能要花费大量时间!)。

2020-07-02