Go|Go Plugins插件的实现方式
官方实现
golang 1.8 及以上版本提供了一个创建共享库(shared object)的新工具,称为 Plugins。目前 Plugins 仅在 Linux、FreeBSD 和 macOS 上受支持,且只支持 golang 调用。?
使用示例,定义一个 plugin.go
:
package mainimport ( "log")func init() { log.Println("plugin init")}type SayHello struct {}func (s *SayHello) CallMe(name string) string { log.Println("hello ", name) return "I am plugin"}// SayHelloPlugin 导出变量var SayHelloPlugin SayHello
使用
-buildmode=plugin
模式编译出 plugin.so
共享库go build -o plugin.so -buildmode=plugin plugin.go
main.go
中调用插件:package mainimport ( "log" "plugin")type CustomPlugin interface { CallMe(name string) string}func main() { // 打开插件(并发安全) p, err := plugin.Open("plugin.so") if err != nil {panic(err) } // 在插件中搜索可导出的变量或函数 sayHelloPlugin, err := p.Lookup("SayHelloPlugin") if err != nil {panic(err) } // 断言插件类型 if sayHello, ok := sayHelloPlugin.(CustomPlugin); ok {log.Println(sayHello.CallMe("togettoyou")) }}
go run main.go# 输出2021/07/28 17:07:21 plugin init2021/07/28 17:07:21 hellotogettoyou2021/07/28 17:07:21 I am plugin
定义一个插件总结:
- package 包名需要定义为 main
- 必须有可导出的变量或函数
- 不需要 main 函数
- 插件加载时会先执行 init 函数
Yaegi 运行在 Go 运行时之上,可以直接作为嵌入式解释器,或使用交互式 shell ,解释运行 Go 代码。不过只支持 Go 1.15 和 Go 1.16(最新的 2 个主要版本)。
创建代码目录结构如下:
│go.mod│go.sum│main.go│└─plugin└─src└─hellogo.modhello.go
这里有个注意点,Yaegi 的插件需要放在 src 目录下。?
其中
hello.go
代码:package helloimport ( "fmt")func init() { fmt.Println("hello plugin init")}func CallMe(msg string) string { fmt.Println(msg) return "I am plugin"}
main.go
代码:package mainimport ( "fmt" "github.com/traefik/yaegi/interp" "github.com/traefik/yaegi/stdlib")func main() { // 初始化解释器 i := interp.New(interp.Options{GoPath: "./plugin/"}) // 插件需要使用标准库 if err := i.Use(stdlib.Symbols); err != nil {panic(err) } // 导入 hello 包 if _, err := i.Eval(`import "hello"`); err != nil {panic(err) } // 调用 hello.CallMe v, err := i.Eval("hello.CallMe") if err != nil {panic(err) } callMe := v.Interface().(func(string) string) fmt.Println(callMe("togettoyou"))}
go run main.go# 输出hello plugin inittogettoyouI am plugin
【Go|Go Plugins插件的实现方式】到此这篇关于Go Plugins插件的实现方式的文章就介绍到这了,更多相关Go Plugins插件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 一个人的旅行,三亚
- 布丽吉特,人生绝对的赢家
- 慢慢的美丽
- 尽力
- 一个小故事,我的思考。
- 家乡的那条小河
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量