go程序中加载go编写的插件
golang版本: 1.5 以上支持动态库,1.8以上支持plugin
go提供的plugin包可以实现热更新的功能。
Go插件是使用-buildmode = plugin
标记编译的一个包,用于生成一个共享对象(.so)库文件。 Go包中的导出的函数和变量被公开为ELF符号,可以使用plugin包在运行时查找并绑定ELF符号。
Go编译器能够使用build flag -buildmode = c-shared
创建C风格的动态共享库。
从1.8版开始,Go插件功能只能在Linux上使用。 很有可能在将来的版本中发生变化。
plugin
Plugin
type Plugin
即Golang加载的插件,与之有关的两个方法:
Open
: 根据参数path
提供的插件路径加载这个插件,并返回插件这个插件结构的指针*Glugin
Lookup
:*Plugin
的惟一方法,通过名称symName
在插件中寻找对应的变量或方法,以Symbol
的形式返回
Symbol
根据定义type Symbol interface{}
,Symbol
是interface
的别名,也就是说,我们可以从插件里面拿到任何类型的可导出元素。
插件实例
本例子有点复杂。
实现插件
插件代码的编写和普通的go模块代码一样,主要是package必须是 main。
类似c的头文件,定义一些数据
package data
type PluginData struct {
Name string
Age int
Tel string
}
var DataChan = make(chan PluginData)
记得函数名要大些不然无法被外部程序访问(init除外)
//testplugin.go
package main
import (
"fmt"
"data"
)
var Value int
var Pd data.PluginData
//init 函数的目的是在插件模块加载的时候自动执行一些我们要做的事情,