利用GoPlugin实现插件化编程的简单方法-《GO开发知识笔记》

admin 2025-11-04 01:09:02 编程 来源:ZONE.CI 全球网 0 阅读模式
  • 前言
  • 1.快速开始
  • 2.注意事项
  • 总结

    前言

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

    1. 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文件,如果一个插件已经被打开了,那么会返回已存在的plugin2.使用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插件化编程内容请搜索完美下载以前的文章或继续浏览下面的相关文章希望大家以后多多支持完美下载!

    以太坊cppgolang区别 编程

    以太坊cppgolang区别

    以太坊是一种去中心化的开源平台,它采用智能合约技术,旨在构建和运行不受干扰的分布式应用程序。作为目前最受欢迎的区块链平台之一,以太坊提供了多种编程语言的支持,其
    progolang 编程

    progolang

    Go语言(Golang)是由Google开发的一门静态类型编程语言。作为一名专业的Golang开发者,我深知这门语言的优势和特点。在本文中,我将介绍Golang
    golangn个发送者 编程

    golangn个发送者

    Golang是一种开源的编程语言,由Google团队开发,旨在提高程序的并发性和简化软件开发过程。在Go语言中,有时需要向多个接收者发送信息。本文将介绍如何在G
    golang技能图谱 编程

    golang技能图谱

    从互联网行业的快速发展到人工智能技术的日益成熟,各种编程语言也应运而生。而在这众多的编程语言中,Golang(即Go)作为一门强大且高效的开发语言备受关注。Go
    评论:0   参与:  9