广告
返回顶部
首页 > 资讯 > 后端开发 > GO >Go Plugins插件的实现方式
  • 246
分享到

Go Plugins插件的实现方式

2024-04-02 19:04:59 246人浏览 薄情痞子
摘要

官方实现 golang 1.8 及以上版本提供了一个创建共享库(shared object)的新工具,称为 Plugins。目前 Plugins 仅在 linux、FreeBSD 和

官方实现

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

定义一个插件总结

  • package 包名需要定义为 main
  • 必须有可导出的变量或函数
  • 不需要 main 函数
  • 插件加载时会先执行 init 函数

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插件内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: Go Plugins插件的实现方式

本文链接: https://www.lsjlt.com/news/132006.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Go Plugins插件的实现方式
    官方实现 golang 1.8 及以上版本提供了一个创建共享库(shared object)的新工具,称为 Plugins。目前 Plugins 仅在 Linux、FreeBSD 和...
    99+
    2022-11-12
  • Go如何实现Plugins插件
    这篇文章将为大家详细讲解有关Go如何实现Plugins插件,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。官方实现golang 1.8 及以上版本提供了一个创建共享库(shared object)的新工具,...
    99+
    2023-06-20
  • 利用Go Plugin实现插件化编程的简单方法
    目录前言1.快速开始2.注意事项总结前言 说到插件这个东西,很多人都不陌生,一般来说,插件化有几个好处,一个是增加程序扩展性,丰富功能。另外,还可以实现热更新,有些大型应用,动辄几个...
    99+
    2022-11-12
  • Go语言实现读取文件的方式总结
    目录前言整个文件读取按行读取逐个单词读取以数据块的形式读取文件二进制读取总结前言 这篇文章将讨论如何在 Golang 中读取文件。我们将使用以下包来处理这些文件。 os 包提供了一个...
    99+
    2023-05-14
    Go语言读取文件方式 Go语言读取文件 Go语言 文件
  • Mybatis插件+注解实现数据脱敏方式
    目录引入问题解决思路Mybatis插件原理实现加解密注解加解密工具类插件实现使用注解在实体类上注解在参数上引入 问题 在项目中需要对用户敏感数据进行脱敏处理,例如身份证号、手机号等信...
    99+
    2022-11-13
  • 怎么利用Go Plugin实现插件化编程
    这期内容当中小编将会给大家带来有关怎么利用Go Plugin实现插件化编程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。前言说到插件这个东西,很多人都不陌生,一般来说,插件化有几个好处,一个是增加程序扩展...
    99+
    2023-06-25
  • Go和Laravel:完美结合的文件框架实现方式?
    在现代软件开发中,文件操作是一个非常常见的需求。从简单的读写文件到复杂的文件操作,我们都需要一个可靠的文件框架来处理这些任务。在本文中,我们将探讨如何使用Go和Laravel这两个流行的编程语言和框架来构建一个完美的文件框架。 为什么使用...
    99+
    2023-06-25
    laravel 文件 框架
  • go按行读取文件的三种实现方式汇总
    目录1. 使用ioutil读取文本2. 使用bufio.Reader的ReadLine读取3.使用bufio.Scanner读取总结1. 使用ioutil读取文本 // 全...
    99+
    2022-11-11
  • jquery插件实现堆叠式菜单
    每天一个jquery插件-堆叠式菜单,供大家参考,具体内容如下 堆叠式菜单 一个多页面的特效 效果如下 代码部分 <!DOCTYPE html> <html&...
    99+
    2022-11-12
  • go实现base64编码的四种方式
    go的encoding/base64有四种编码方式: 编码方式说明StdEncoding常规编码URLEncodingURL safe 编码,相当于替换掉字符串中的特殊字符,+ 和 ...
    99+
    2023-03-07
    go实现base64编码 go base64编码
  • Node.js插件的正确编写方式
    Node.js在利用JavaScript编写后端方面效果拔群,值得我们多加尝试。不过如果大家需要一些无法直接使用的功能甚至是根本无从实现的模块使用,那么能否从C/C++库当中引入此类成果呢?答案是肯定的,大...
    99+
    2022-06-04
    插件 正确 方式
  • jQuery如何实现链式插件调用
    这篇文章给大家分享的是有关jQuery如何实现链式插件调用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。链式插件调用jQuery允许“链式”插件的方法调用,以减轻反复查询DOM并...
    99+
    2022-10-19
  • Go Error 嵌套实现创建方式
    目录创建 Errorerrors.New()fmt.Errorf()Wrap Error后记Go Error 的设计哲学是 「Errors Are Values」。 这句话应该怎么理...
    99+
    2022-11-12
  • go实现base64编码的方式有哪些
    本篇内容主要讲解“go实现base64编码的方式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“go实现base64编码的方式有哪些”吧!go的encoding/base64有四种编码方式:...
    99+
    2023-07-05
  • jquery插件实现悬浮菜单的方法
    这篇文章给大家分享的是有关jquery插件实现悬浮菜单的方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。jquery是什么jquery是一个简洁而快速的JavaScript库,它具有独特的链式语法和短小清晰的多...
    99+
    2023-06-14
  • Vue3 中自定义插件的实现方法
    目录1. Vue 插件2. 自定义插件2.1 基本用法2.2 加入组件2.3 加入指令2.4 provide & inject3. 小结最近在录 TienChin 项目,项目...
    99+
    2022-11-13
    Vue自定义插件 Vue3自定义插件
  • 安装Sublime Text支持Go插件的方法步骤
    1、安装GO 进入GO的国内网站,下载安装 https://golang.google.cn/ 2、环境变更配置 重要的是GOROOT 和 GOPATH, 一般安装在C:\GO目录下...
    99+
    2022-11-12
  • jquery插件怎么实现堆叠式菜单
    这篇文章主要介绍jquery插件怎么实现堆叠式菜单,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!jquery是什么jquery是一个简洁而快速的JavaScript库,它具有独特的链式语法和短小清晰的多功能接口、高效...
    99+
    2023-06-14
  • go web 预防跨站脚本的实现方式
    目录一 点睛二 先看一个转义的例子三 使用 text/template 进行处理四 使用 html/template 进行...
    99+
    2022-11-12
  • WordPress中自动激活插件的实现方法
    有一个一劳永逸的方法可以使wordpress博主以后上传插件都不用再手动激活,wordpress自动激活,方法很简单,添加段函数代码即可。 wordpress自动激活插件: 在主题模板下的functions.php文件中...
    99+
    2022-06-12
    自动激活插件
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作