在golang中动态加载包

Pep*_*uis 31 load runtime dynamic package go

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

One*_*One 29

不,Go不支持动态加载的库.

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

2017年更新

这个答案不再适用,Go现在支持插件.

  • 但仍然只在Linux上(截至1.8) (3认同)

tho*_*ows 16

从1.8开始,现在支持这一点

https://golang.org/pkg/plugin/


Mat*_*man 13

您可以考虑在运行时执行'plugin'包,方法是写一个新程序(比如说,到一个临时目录)并通过exec.Command执行,这就是exec.Command("go", "run", files…).Run()

你会在这里看到一些类似的代码.

  • 我通过独立构建几个插件来进行"动态加载",这些插件必须支持从stdin读取数据,然后在main.go中,我从配置文件中读取插件列表,然后使用exec.Command启动每个插件(在go例程中) ),然后我可以写插件的StdinPipe,每个插件都可以读取. (3认同)