编程语言应用

首页 » 常识 » 常识 » 一文搞懂Go语言的plugin
TUhjnbcbe - 2021/8/24 22:22:00

要历数Go语言中还有哪些我还没用过的特性,在Go1.8版本[1]中引入的goplugin[2]算一个。近期想给一个网关类平台设计一个插件系统,于是想起了goplugin^_^。

Goplugin支持将Go包编译为共享库(.so)的形式单独发布,主程序可以在运行时动态加载这些编译为动态共享库文件的goplugin,从中提取导出(exported)变量或函数的符号并在主程序的包中使用。Goplugin的这种特性为Go开发人员提供更多的灵活性,我们可以用之实现支持热插拔的插件系统。

但不得不提到的一个事实是:goplugin自诞生以来已有4年多了,但它依旧没有被广泛地应用起来。究其原因,(我猜)一方面Go自身支持静态编译,可以将应用编译为一个完全不需要依赖操作系统运行时库(一般为libc)的可执行文件,这是Go的优势,而支持goplugin则意味着你只能对主程序进行动态编译,与静态编译的优势相悖;而另外一方面原因占比更大,那就是Goplugin自身有太多的对使用者的约束,这让很多Go开发人员望而却步。

只有亲历,才能体会到其中的滋味。在这篇文章中,我们就一起来看看goplugin究竟是何许东东,它对使用者究竟有着怎样的约束,我们究竟要不要使用它。

1.goplugin的基本使用方法

截至Go1.16版本,Go官方文档明确说明goplugin只支持Linux,FreeBSD和macOS,这算是goplugin的第一个约束。在处理器层面,goplugin以支持amd64(x86-64)为主,对arm系列芯片的支持似乎没有明确说明(我翻看各个Go版本releasenotes也没看到,也许是我漏掉了),但我在华为的泰山服务器(鲲鹏arm64芯片)上使用Go1.16.2(forarm64)版本构建plugin包以及加载动态共享库.so文件的主程序都顺利通过编译,运行也一切正常。

主程序通过plugin包加载.so并提取.so文件中的符号的过程与C语言应用运行时加载动态链接库并调用库中函数的过程如出一辙。下面我们就来看一个直观的例子。

下面是这个例子的结构布局:

//github.

1
查看完整版本: 一文搞懂Go语言的plugin