在实践中学习,动动手指
package main
import "common/greeterinterface"
type ChineseGreeter struct {
}
func (g *ChineseGreeter) Greet() string {
return "世界你好"
}
// 这个就是可导出的函数,插件在lookup这个函数
func NewGreeter() greeterinterface.Greeter {
return new(ChineseGreeter)
}
编译插件
go build -buildmode=plugin -o ./ch.so ch.go
package plug
import (
"plugin"
"common/greeterinterface" // 主程序中,仍然引用了这个接口,它是对插件的桥梁
"log"
)
func Load() (err error) {
// 打开插件
plug, err := plugin.Open("./ch.so")
if err!=nil{
log.Fatalf("load plugin failed:%v", err)
}
// 寻找对象
greeterObj, err := plug.Lookup("NewGreeter")
if err!=nil{
log.Fatalf("look up failed :%v", err)
}
// 转换对象的格式
creator := greeterObj.(func() greeterinterface.Greeter)
greeter := creator() // 此时调用的是插件中的函数
greeter.Greet() // 创建的结构和直接写代码new的无区别
return nil
}
太棒了,现在你已经获得了写插件的新技能。这里有几点实现插件的不成熟建议:
common/greeterinterface
。NewGreeter
。总体来说,plugin 包还有相当大的提升空间,但这似乎并不是go团队的关注重点。