背景

在我做 C 语言开发的时候,为了让程序有更好的扩展性,通常选择将需要扩展的功能实现为插件,通过加载 so 文件的方式导入插件中的函数。当我学 Golang 的时候,很希望能有这样的插件功能。终于,Golang 在 1.8 版本的时候支持了插件功能。于是,第一时间尝鲜,并写了个开源库来支持热更新插件,代码地址在文末。

环境

系统: linux (别问为什么,因为 windows 下 Golang不支持动态库) Golang 版本: 1.5 以上支持动态库,1.8 以上支持 plugin

插件代码

插件代码跟普通的 Golang 模块代码没啥差别,主要是 package 必须是 main。下面是一段简易的插件代码

//testplugin.go
package mainimport ("fmt"
)func init() {fmt.Println("world")//我们还可以做其他更高阶的事情,比如 platform.RegisterPlugin({"func": Hello}) 之类的,向插件平台自动注册该插件的函数
}func Hello() {fmt.Println("hello")
}

init 函数的目的是在插件模块加载的时候自动执行一些我们要做的事情,比如:自动将方法和类型注册到插件平台、输出插件信息等等。

Hello 函数则是我们需要在调用方显式查找的 symbol

编译命令

go build -buildmode=plugin testplugin.go

编译完后我们可以看到当前目录下有一个 testplugin.so 文件 我们也可以通过类似如下命令来生成不同版本的插件

go build -o testplugin_v1.so -buildmode=plugin testplugin.go

如果要想更好的控制插件的版本,想做更酷的事情,比如:热更新插件。那么可以采用自动注册的方式,新版本的插件加载上来后,自动注册插件版本号,插件平台里优先使用新版本的方法。

使用

使用方需要引入 plugin 这个包

//main.go
package mainimport ("plugin"
)func main() {p, err := plugin.Open("testplugin.so")if err != nil {panic(err)}   f, err := p.Lookup("Hello")if err != nil {panic(err)}   f.(func())()
}

输出

$ go run main.go
world
hello

我们可以看到,我们只显式调用了插件中的 Hello 方法,打印 hello 这个字符串,但是在调用 Hello 之前,已经输出了 world,这个正是插件 init 函数做的事情。

总结

Golang 支持插件使得 Golang 程序的扩展性上升到另一个台阶,可以用来做更酷的事情,如:利用插件做服务的热更新

代码:https://github.com/letiantech/hotplugin

推荐文章

如何用Go打造千万级流量秒杀系统​mp.weixin.qq.com

扫码关注公众号

go 查找模块位置_如何使用Go语言插件功能?相关推荐

  1. 查找字符位置_如何使用find函数和search函数精确查找字符

    精确查找指定字符在一个字符串中的位置是Excel函数运用中的一项重要的技巧,尤其是在截取字符串.替换字符串等文本处理过程中,精确定位技术更是必不可少.查找字符的主要函数是find函数和search函数 ...

  2. 查找字符位置_查找某个字符最后一次出现的位置

    在EXCEL文档里想从很长的文件路径中取得文件名,[数据]→[分列]是个不错的选择,但用函数会显得更高大上一些. 首先,需要获取最后一个"\"所在的位置. 方法1: FIND(&q ...

  3. 查找字符位置_学习VB编程第69天 字符串查找与替换

    今天学习了VB提升教程4期,学习的主要内容是字符串查找与替换.零基础学VB课程已经结束,但是感觉还是没有太大进步,而且目前也没有确定后续该学什么语言,干脆就继续再学一段时间VB吧反正计划的三个月时间还 ...

  4. python如何在列表中查找元素位置_查找元素在list中的位置以及折半查询

    问题 查找某个值在list中的位置 解决思路 能够用折半查询的方法解决此问题. 解决(Python) #! /usr/bin/env python #coding:utf-8 #折半查找某个元素在li ...

  5. python 查找函数所在模块和文件位置_查看python的模块和函数帮助文档方法

    python的一个优势是有着大量自带和在线的模块(module)资源,可以提供丰富的功能,在使用这些模块的时候,如果每次都去网站找在线文档会过于耗费时间,结果也不一定准确.因此这里介绍下python自 ...

  6. pta数据结构实验在数组中查找指定元素_如何从一个数组中查找指定的元素,并返回这个元素在数组中的位置...

    展开全部 和Vector都是使用Objec的数组形式来存储的.当你向这两种类型中增加元素的时候,如果元素的数目超出e68a84e8a2ad62616964757a686964616f313332646 ...

  7. Python引用模块和查找模块路径

    这篇文章主要介绍了Python引用模块和Python查找模块路径的相关资料,需要的朋友可以参考下 模块间相互独立相互引用是任何一种编程语言的基础能力.对于"模块"这个词在各种编程语 ...

  8. 【Simulink】查找模块的四种方法

    很多小伙伴在刚入门simulink的时候找不到模块,这里我将总结一下我曾经用过的4种查找模块的方法. 版本:R2019b 以元器件 From 为例 1.(大海捞针) Library Browser查找 ...

  9. 代码内查找函数引用_叮~~二级操作题 excel常考函数大梳理

    1.AND函数 格式:AND(logical1,logical2-) 功能:and函数是一个逻辑函数,表示同时满足多个条件.通常配合if函数做条件判断,得值为true或者是false. 2.OR函数 ...

最新文章

  1. 编写一个函数,实现两个字符串的连接功能
  2. Android中pendingIntent的深入理解
  3. 使用oauth2.0自动获取用户信息
  4. D - Yet Another Problem On a Subsequence CodeForces - 1000D (DP,组合数学)
  5. 客座编辑:吴东亚(1972-),女,中国电子技术标准化研究院信息技术研究中心高级工程师、副主任,国家OID注册中心副主任。...
  6. CSS3 盒尺寸 box-sizing属性
  7. Keras学习---RNN模型建立篇
  8. SQL Server详细教程
  9. 智能硬件再下一城:家居
  10. 一位 Google 大佬的辞职感言..
  11. 加盟 XEIM 开源即时通讯软件团队
  12. FRM 风险管理基础:复习提纲二
  13. P5.js创意自画像编程
  14. 移植python到小米路由器记录。
  15. STM32DAC输出遇到的问题
  16. linux查看php端口,Linux如何查看端口状态
  17. Vijos P1836HYS与七夕节大作战
  18. ANDROID 11 文件系统挂载
  19. long数组与Long数组转换
  20. MindManager2020官方免费版下载激活版思维导图

热门文章

  1. python socks代理_Python中使用socks5设置全局代理的方法示例
  2. 坚果nuts 加速 官网_坚果?R2?正式发布:延续经典设计,提供旗舰性能,而且是“下一代电脑”...
  3. 鸿蒙战略看点,鸿蒙OS四大看点详解!华为的野心不止手机,而是“一统江湖”...
  4. bt云服务器地址,windows2008搭建bttracker服务器
  5. 2016计算机知识点,2016年计算机一级考试知识点
  6. 细胞增殖曲线_两种月龄近交系五指山小型猪脂肪间充质干细胞生物学特性的比较...
  7. win7上的linux环境变量,java之环境变量配置win7andlinux.docx
  8. 学习笔记(06):MySQL数据库运维与管理-01-用户创建及授权
  9. python 会计凭证_实际工作中,大多数单位都使用单式记账凭证。()
  10. 基于JAVA+SpringMVC+Mybatis+MYSQL的在线作业管理系统