Dynamic 动态加载包

Dynamic 动态加载包,dynamic,go,load,runtime,package,Dynamic,Go,Load,Runtime,Package,是否可以在运行时加载特定的包? 我希望有一种插件,其中每个插件的功能与其他插件相同,但行为不同,并且根据配置文件加载一个或另一个。不,Go不支持动态加载库 最好的办法是将插件作为自己的可执行文件启动,并通过套接字或stdin/stdout与之通信 2017年更新 这个答案不再是真的,现在支持(对于Linux和Mac OS直到2021年6月)< P>你可以考虑在运行时执行“插件”包,通过编写一个新程序(例如,到一个临时目录),并通过“代码”> Exc.命令(“go”,“run”,文件…)运行。 您

是否可以在运行时加载特定的包?
我希望有一种插件,其中每个插件的功能与其他插件相同,但行为不同,并且根据配置文件加载一个或另一个。

不,Go不支持动态加载库

最好的办法是将插件作为自己的可执行文件启动,并通过套接字或stdin/stdout与之通信

2017年更新


<>这个答案不再是真的,现在支持(对于Linux和Mac OS直到2021年6月)

< P>你可以考虑在运行时执行“插件”包,通过编写一个新程序(例如,到一个临时目录),并通过“代码”> Exc.命令(“go”,“run”,文件…)运行。
您将看到一些类似的代码。

我认为您正在寻找的是特殊函数
init

如果你加一个

func init() {

}
在包内,它将在第一次导入包时运行它。
这只发生在同一个二进制文件中。正如其他人已经说过的那样,go不支持动态加载库。

只需执行这些操作,创建一个codegen来读取配置,生成一个基本go文件,并按顺序加载包,然后执行该操作,编译语言既不会也不会提供动态加载,即使dart在某种程度上受到影响,只需读取配置文件,然后创建一个带有必要代码的临时文件,以便加载并与套接字或http通信。从go 1.8开始,现在就支持此功能


但是这样,我怎么能在不知道将使用哪个软件包的情况下第一次加载该软件包呢?但仍然只在Linux上(从go 1.8开始)。好吧,Linux和osx。它还不稳定<代码>插件支持目前不完整,仅支持Linux,并且存在已知错误。请报告任何问题。Hi,谢谢,它可以解决我的问题,我可以与zeroMQ或类似的软件进行通信。我通过独立构建几个插件来进行“动态加载”,这些插件必须支持从stdin读取数据,然后在main.go中,我从配置文件中读取插件列表,然后使用exec.Command启动每个插件(在go例程中),然后我可以写入插件的StdinPipe,每个插件都可以读取。init的问题是,在读取配置文件之前,我不知道应该加载哪个包。因此,如果我不能动态加载包,init方式就不是解决方案。“编译语言不会也不会提供动态加载”-c/c++是编译语言,它们确实通过“dlopen”提供。除go外,几乎所有语言都提供某种动态加载。现在有一个允许使用共享库的。如何生成这些库以及是否可以将go代码转换为库是不同的关注点。。。