• 企业400电话
  • 网络优化推广
  • AI电话机器人
  • 呼叫中心
  • 全 部 栏 目

    网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Go Plugins插件的实现方式
    POST TIME:2021-10-18 16:59

    官方实现

    golang 1.8 及以上版本提供了一个创建共享库(shared object)的新工具,称为 Plugins。目前 Plugins 仅在 Linux、FreeBSD 和 macOS 上受支持,且只支持 golang 调用。​

    使用示例,定义一个 plugin.go

    package main
    
    import (
     "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 main
    
    import (
     "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 init
    2021/07/28 17:07:21 hello  togettoyou
    2021/07/28 17:07:21 I am plugin

    定义一个插件总结:

    Traefik Yaegi 实现

    Yaegi 是 Traefik 开源的 Go 解释器。Traefik 自身的插件实现就是使用的 Yaegi 。​

    Yaegi 运行在 Go 运行时之上,可以直接作为嵌入式解释器,或使用交互式 shell ,解释运行 Go 代码。不过只支持 Go 1.15 和 Go 1.16(最新的 2 个主要版本)。

    创建代码目录结构如下:

    │  go.mod
    │  go.sum
    │  main.go
    │
    └─plugin
        └─src
            └─hello
                    go.mod
                    hello.go

    这里有个注意点,Yaegi 的插件需要放在 src 目录下。​

    其中 hello.go 代码:

    package hello
    
    import (
     "fmt"
    )
    
    func init() {
     fmt.Println("hello plugin init")
    }
    
    func CallMe(msg string) string {
     fmt.Println(msg)
     return "I am plugin"
    }

    main.go 代码:

    package main
    
    import (
     "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 init
    togettoyou
    I am plugin

    到此这篇关于Go Plugins插件的实现方式的文章就介绍到这了,更多相关Go Plugins插件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • 成功安装vscode中go的相关插件(详细教程)
    • VSCode配置Go插件和第三方拓展包的详细教程
    • VSCode必装Go语言以下插件的思路详解
    • 解决vscode中golang插件依赖安装失败问题
    • 使用jQuery.Qrcode插件在客户端动态生成二维码并添加自定义Logo
    上一篇:使用GO语言实现Mysql数据库CURD的简单示例
    下一篇:基于HLS创建Golang视频流服务器的优缺点
  • 相关文章
  • 

    关于我们 | 付款方式 | 荣誉资质 | 业务提交 | 代理合作


    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    X

    截屏,微信识别二维码

    微信号:veteran88

    (点击微信号复制,添加好友)

     打开微信