[Go] golang plugin插件使用
Contents
Package plugin implements loading and symbol resolution of Go plugins.
Golang是静态编译型语言,在编译时就将所有引用的包(库)全部加载打包到最终的可执行程序(或库文件)中, 因此并不能在运行时动态加载其他共享库。而Go Plugin提供了在运行时动态加载外部功能。
plugin应用场景:
- 可插拔
- 可以热更新式扩展应用程序的功能列表
- 应对多变的业务需求,方便功能上下线
- 对于任意的go应用,能进行增量架构、代码分发以及代码上下线
- 动态加载的需要
- 通过plugin可以很方便的对于不同功能加载相应的模块并调用相关的模块
- 可以针对不同语言(英文、汉语、德语……)加载不同的语言so文件,进行不同的输出
- 独立开发
- 可以把编译出的文件给不同的编程语言用(如:c/java/python/lua等)
标准库方法
|
|
Open
: 通过参数path
路径加载插件,返回*Plugin指针Lookup
: *Plugin指针方法,该方法通过名称symName
在插件中查找对应的变量或方法,返回Symbol
类型Symbol
类型是interface{}
的别名,也意味着可以从插件里面拿到任何类型的可导出元素
go plugin示例
插件代码,提供一个简单的Add方法
|
|
编译插件,生成add.so文件
|
|
使用plugin库加载插件,使用插件方法
|
|
调用http服务
|
|
c-shared示例
使用buildmode=plugin
会生成.so文件;
使用buildmode=c-shared
会生成出来两个文件,一个.so文件,一个.h头文件,和使用c生成的库文件和模块文件一样使用
awesome.go代码
|
|
编译awesome.go文件,生成awesome.h
, awesome.so
两个文件
|
|
查看so文件,输出为shared object文件,并exported相关对像的symbols
|
|
c语言动态链接调用
|
|
编译awesome1.c文件并运行
|
|
c语言动态加载
|
|
编译awesome2.c文件并运行
|
|