在运行时加载特定的软件包是否可行? 我想拥有一种插件,每个插件都具有与其他插件相同的功能,但具有不同的行为,并且根据配置文件的设置加载其中一个或另一个插件。
不,Go语言不支持动态加载库。
最好的选择是将插件作为独立可执行文件启动,并通过套接字或stdin/stdout进行通信。
2017更新
这个答案现在已经不正确了,Go现在支持插件(截至2021年6月仅适用于Linux和MacOS)
exec.Command("go", "run", files…).Run()
在这里可以看到一些类似的代码here。只需要这样做,创建一个代码生成器来读取配置文件,在按顺序加载包的基本go文件中生成代码,然后执行它。编译型语言无法提供动态加载,甚至Dart也有点受苦,简单地读取配置文件,然后创建一个临时文件,其中包含必要的代码以加载并与套接字或HTTP通信。
我认为你正在寻找的是特殊函数init
如果你添加一个
func init() {
}
在一个包内,它将在第一次导入该包时运行。这仅在同一二进制文件中发生。正如其他人已经说过的那样,Go不支持动态加载库。
插件支持目前还不完整,仅支持Linux,并且已知存在一些bug。请报告任何问题。
- Aaron