咔叽游戏

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 365|回复: 0

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

[复制链接]
  • TA的每日心情
    无聊
    2019-4-21 13:02
  • 签到天数: 3 天

    [LV.2]圆转纯熟

    发表于 2021-12-31 22:11:26 | 显示全部楼层 |阅读模式
    目录

      前言1.快速开始2.注意事项总结


    前言

    说到插件这个东西,很多人都不陌生,一般来说,插件化有几个好处,一个是增加程序扩展性,丰富功能。另外,还可以实现热更新,有些大型应用,动辄几个GB的安装程序,如果一个小小的更新就需要重新下载整个程序,这时候我们就可以把经常更新的模块插件化,这样更新的时候只需要下载一个小更新文件。比如说平时咱们Chrome浏览器都会装一些插件,可以扩展浏览器实现更多的功能,还能灵活的安装卸载。
    Golang在1.8版本之后提供了一个 Plugin 的机制,可以动态的加载so文件,实现插件化,虽然并不是非常成熟,但是在特定的情况下还是非常好用。
    Currently plugins are only supported on Linux, FreeBSD, and macOS.

    1.快速开始


    插件代码和普通代码没什么区别,只是在编译的时候不一样,但是要求是必须只有一个main包
    1. package main
    2. var Name = "Plugin Name"
    3. func GetName() string {
    4.     return Name
    5. }
    复制代码
    使用go build -buildmode=plugin编译,会得到一个so文件,怎么使用这个文件呢?
    很简单,分三步:
    1.先打开so文件,如果一个插件已经被打开了,那么会返回已存在的plugin
    2.使用Lookup查找需要调用的变量或者函数,名字必须大写开头
    3.断言后调用
    1. func main() {
    2.     //打开加载插件,参数是插件的存储位置,可以是相对路径
    3.     open, err := plugin.Open("/home/jwang/Documents/plg.so")
    4.     if err != nil {
    5.         panic(err)
    6.     }
    7.     //查找标识符
    8.     lookup, err := open.Lookup("GetName")
    9.     if err != nil {
    10.         panic(err)
    11.     }
    12.     res := lookup.(func() string)()
    13.     fmt.Printf("%v\n", res)
    14.     name, err := open.Lookup("Name")
    15.     if err != nil {
    16.         panic(err)
    17.     }
    18.     fmt.Printf("%v\n", *name.(*string))
    19. }
    复制代码
    从上面的代码可以看到,插件的使用方式非常朴实无华,简单易懂。
    一般来说,为了实现插件化,可以事先定义好一些接口,然后由插件去实现这些接口,这样才能保证一致性,但是接口的定义不能写在插件包或者调用包里面。这时候就需要定义一个专门的公共包,把接口的定义写在里面,这样插件包和调用包都可以引用。

    2.注意事项


    之所以说这个插件方案不成熟,主要是由于主程序和插件程序之间存在很强的依赖性,比如:
    1.编译的GO版本必须完全一致
    2.双方依赖的公共第三方库版本必须完全一致
    3.GOPATH也得保持一致,这一点可以在编译时候使用trimpath参数解决
    4.插件加载之后无法卸载
    这些问题短时间内好像官方也没有解决的意思,或者说无法解决。总之,Go plugin目前的应用很少,毕竟作为网络编程语言,在容器化大行其道的环境下,更新程序是一件很轻松的事情,除非有特殊需要。

    总结

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

    原文地址:https://www.jb51.net/article/226829.htm

    QQ|免责声明|小黑屋|手机版|Archiver|咔叽游戏

    GMT+8, 2024-3-29 14:05

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

    快速回复 返回顶部 返回列表