Go 插件系统

Go 插件系统 #

Go 1.8 版本开始提供了一个创建共享库的新工具,称为 Plugins.

Go 插件是使用 -buildmode=plugin 标记编译的一个包,用于生成一个共享对象(.so)库文件。 Go 包中的导出的函数和变量被公开为 ELF 符号,可以使用 plugin 包在运行时查找并绑定 ELF 符号。

Go 编译器能够使用 build flag -buildmode=c-shared 创建 C 风格的动态共享库。


编写 plugin #

  • 包名称必须是 main
  • 没有 main 函数
  • 必须有可以导出 (访问) 的变量或者方法

使用 plugin #

  • 加载编译好的插件 plugin.Open("./plugin_doctor.so") (*.so 文件路径相对与可执行文件的路径,可以是绝对路径)
  • 寻找插件可到变量 plug.Lookup("Doctor"),
  • TypeAssert: Symbol (interface {}) 转换成 API 的接口类型
  • 执行 API interface 的方法

优点 #

缺陷 #

插件实现和主应用程序都必须使用完全相同的 Go 工具链版本构建。 由于插件提供的代码将与主代码在相同的进程空间中运行,因此编译的二进制文件应与主应用程序 100% 兼容。

插件系统迫使你的插件实现与主应用程序产生高度耦合。 即使你可以控制插件和主应用程序,最终结果也非常脆弱且难以维护。 如果插件的作者对主应用程序没有任何控制权,开销会更高。

参考 #