为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
收到一只叮咚 2021-06-16 13:01:24
正如标题所说,我想根据仅在运行时可用的信息动态加载 Go 包(或不加载)。目标是允许用户通过添加新本机脚本命令的自定义包来扩展程序。目前,每次我添加新命令或想要禁止某些命令时,我都需要编辑程序并重新编译,而如果我可以制作某种 dll 或类似的东西,那么我可以创建一个“导入”脚本命令来搜索和加载一个命名的命令库。出于好奇,有问题的程序是基于自定义命令的脚本库,我用于各种事情。我提前做了一些搜索,结果看起来不太好,但我找不到明确的否。
查看完整描述

3 回答

?
BIG阳

TA贡献1859条经验 获得超6个赞

Go 尚不支持动态库。Elias Naur 最近发布了一些补丁,但它们尚未经过审核,它们不太可能包含在 Go 1.2 中。您可以阅读 Google Groups 上的讨论:

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

然而,还有另一种方法。您可以在单独的进程中启动您的插件,并使用net/rpc包与您的主应用程序进行通信。这也允许您动态启动/停止/重新编译单独的插件,它的优点是坏插件不会使您的程序崩溃。Go 擅长网络通信,你只需要好好利用它。

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

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


查看完整回答
反对 回复 2021-06-28
?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

好吧,Go有一个dlopen 包——所以,至少,你现在可以将你的共享库 (DLL) 加载到你的 Go 程序中......你可能必须用 C、C++ 编写你的扩展或其他东西,您拥有能够生成共享库的工具。


查看完整回答
反对 回复 2021-06-28
  • 3 回答
  • 0 关注
  • 429 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信