我的编程空间,编程开发者的网络收藏夹
学习永远不晚

利用Go Plugin实现插件化编程的简单方法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

利用Go Plugin实现插件化编程的简单方法

前言

说到插件这个东西,很多人都不陌生,一般来说,插件化有几个好处,一个是增加程序扩展性,丰富功能。另外,还可以实现热更新,有些大型应用,动辄几个GB的安装程序,如果一个小小的更新就需要重新下载整个程序,这时候我们就可以把经常更新的模块插件化,这样更新的时候只需要下载一个小更新文件。比如说平时咱们Chrome浏览器都会装一些插件,可以扩展浏览器实现更多的功能,还能灵活的安装卸载。

Golang在1.8版本之后提供了一个 Plugin 的机制,可以动态的加载so文件,实现插件化,虽然并不是非常成熟,但是在特定的情况下还是非常好用。

Currently plugins are only supported on Linux, FreeBSD, and macOS.

1.快速开始

插件代码和普通代码没什么区别,只是在编译的时候不一样,但是要求是必须只有一个main包


package main

var Name = "Plugin Name"

func GetName() string {
    return Name
}

使用go build -buildmode=plugin编译,会得到一个so文件,怎么使用这个文件呢?

很简单,分三步:

1.先打开so文件,如果一个插件已经被打开了,那么会返回已存在的plugin

2.使用Lookup查找需要调用的变量或者函数,名字必须大写开头

3.断言后调用


func main() {
    //打开加载插件,参数是插件的存储位置,可以是相对路径
    open, err := plugin.Open("/home/jwang/Documents/plg.so")
    if err != nil {
        panic(err)
    }
    //查找标识符
    lookup, err := open.Lookup("GetName")
    if err != nil {
        panic(err)
    }
    res := lookup.(func() string)()
    fmt.Printf("%v\n", res)

    name, err := open.Lookup("Name")
    if err != nil {
        panic(err)
    }
    fmt.Printf("%v\n", *name.(*string))
}

从上面的代码可以看到,插件的使用方式非常朴实无华,简单易懂。

一般来说,为了实现插件化,可以事先定义好一些接口,然后由插件去实现这些接口,这样才能保证一致性,但是接口的定义不能写在插件包或者调用包里面。这时候就需要定义一个专门的公共包,把接口的定义写在里面,这样插件包和调用包都可以引用。

2.注意事项

之所以说这个插件方案不成熟,主要是由于主程序和插件程序之间存在很强的依赖性,比如:

1.编译的GO版本必须完全一致

2.双方依赖的公共第三方库版本必须完全一致

3.GOPATH也得保持一致,这一点可以在编译时候使用trimpath参数解决

4.插件加载之后无法卸载

这些问题短时间内好像官方也没有解决的意思,或者说无法解决。总之,Go plugin目前的应用很少,毕竟作为网络编程语言,在容器化大行其道的环境下,更新程序是一件很轻松的事情,除非有特殊需要。

总结

到此这篇关于利用Go Plugin实现插件化编程的文章就介绍到这了,更多相关Go Plugin插件化编程内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

利用Go Plugin实现插件化编程的简单方法

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

下载Word文档

猜你喜欢

怎么利用Go Plugin实现插件化编程

这期内容当中小编将会给大家带来有关怎么利用Go Plugin实现插件化编程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。前言说到插件这个东西,很多人都不陌生,一般来说,插件化有几个好处,一个是增加程序扩展
2023-06-25

Android编程简单实现拨号器功能的方法

本文实例讲述了Android编程简单实现拨号器功能的方法。分享给大家供大家参考,具体如下:学习Android已经有2天时间了,没学习的时候觉得android可能很枯燥,但是学过之后我发觉其实这个比什么javaweb好玩多了。学习androi
2023-05-30

Android编程实现简单设置按钮颜色的方法

本文实例讲述了Android编程实现简单设置按钮颜色的方法。分享给大家供大家参考,具体如下: 1.工程目录 a.在res目录-新建drawble文件夹放入自定义图片2.main.xml
2022-06-06

Android编程之简单逐帧动画Frame的实现方法

本文实例讲述了Android编程之简单逐帧动画Frame的实现方法。分享给大家供大家参考,具体如下: 1、逐帧动画 即是通过播放预先排序好的图片来实现动态的画面,感觉像是放电影。 2、实现步骤: ① 在工程里面导入要播放的图片。此简单例子中
2022-06-06

Android编程使用GestureDetector实现简单手势监听与处理的方法

本文实例讲述了Android编程使用GestureDetector实现简单手势监听与处理的方法。分享给大家供大家参考,具体如下:添加手势识别监听步骤:一、给相应的控件添加触摸监听事件,二、利用GestureDetector转发这个触摸事件。
2023-05-30

如何利用C++实现一个简单的邮件客户端程序?

如何利用C++实现一个简单的邮件客户端程序?随着互联网的快速发展,电子邮件已经成为人们日常生活中必不可少的一部分。作为一名程序员,掌握如何利用C++语言来实现一个简单的邮件客户端程序无疑是非常重要的。本文将以1500个字以内的篇幅,介绍如何
如何利用C++实现一个简单的邮件客户端程序?
2023-11-04

Python使用tablib生成excel文件的简单实现方法

本文实例讲述了Python使用tablib生成excel文件的方法。分享给大家供大家参考,具体如下:import tablib headers = ('lie1', 'lie2', 'lie3', 'lie4', 'lie5') mylis
2022-06-04

Android编程将Activity背景设置为墙纸的简单实现方法

本文实例讲述了Android编程将Activity背景设置为墙纸的简单实现方法。分享给大家供大家参考,具体如下: 1)代码方式Drawable wallPaper = WallpaperManager.getInstance( this).
2022-06-06

Android编程简单实现ImageView点击时背景图修改的方法

本文实例讲述了Android编程简单实现ImageView点击时背景图修改的方法。分享给大家供大家参考,具体如下: 在使用ImageView时,当被点击时,希望背景图修改一下,这样显示被点击效果明显一些。在这里,一个很简单的方法,最起码是个
2022-06-06

python判断字符串编码的简单实现方法(使用chardet)

本文实例讲述了python判断字符串编码的方法。分享给大家供大家参考,具体如下: 安装chardet模块 chardet文件夹放在/usr/lib/python2.4/site-packages目录下[root@sha-sso-data01
2022-06-04

如何利用C++实现一个简单的电子邮件发送程序?

如何利用C++实现一个简单的电子邮件发送程序?随着互联网的普及,电子邮件已经成为人们日常生活和工作中不可或缺的一部分。在C++编程中,我们可以利用SMTP(Simple Mail Transfer Protocol)协议实现一个简单的电子邮
如何利用C++实现一个简单的电子邮件发送程序?
2023-11-02

Android编程实现为应用添加菜单的方法

本文实例讲述了Android编程实现为应用添加菜单的方法。分享给大家供大家参考,具体如下: 添加菜单的方法有很多,一般推荐用xml创建菜单。 建立menu步骤: 在res下建立一个menu文件夹,在menu文件里面添加一个xml文件:
2022-06-06

Python利用itchat对微信中好友数据实现简单分析的方法

前言 最近在一个微信公众号上看到一个调用微信 API 可以对微信好友进行简单数据分析的一个包 itchat 感觉挺好用的,就简单尝试了一下。 库文档说明链接在这: itchat 安装 在终端中输入以下命令,完成微信的API包itchat的安
2022-06-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录