一. 什么是Plugin
- golang提供了一个
plugin包
,它能够让程序在运行时动态加载外部功能
。 - type Plugin即Golang加载的插件,与之有关的两个方法:
Open:
根据参数path提供的插件路径加载这个插件,并返回插件这个插件结构的指针*Glugin
Lookup:
*Plugin
的惟一方法
,通过名称symName
在插件中寻找对应的变量或方法,以Symbol
的形式返回
二. Plugin示例
1.创建插件文件:calc.go
package main //plugin必须在main包里
func Add(x, y int) int {
return x + y
}
func Sub(x, y int) int {
return x - y
}
2.编译插件:
$ go build -buildmode = plugin -o calc.so calc.go
- so文件格式即ELF文件格式,它是Linux下可执行文件,共享库文件和目标文件的统一格式。
3.调用插件:
import "plugin"
func main() {
p, _ := plugin.Open("./calc.so")
add, _ := p.Lookup("Add")
result := add.(func(int, int) int)(1, 2)
fmt.Println(result)
sub, _ := p.Lookup("Sub")
result = sub.(func(int, int) int)(1, 2)
fmt.Println(result)
}