go程序中加载go编写的插件

go程序中加载go编写的插件

golang版本: 1.5 以上支持动态库,1.8以上支持plugin

go提供的plugin包可以实现热更新的功能。

Go插件是使用-buildmode = plugin标记编译的一个包,用于生成一个共享对象(.so)库文件。 Go包中的导出的函数和变量被公开为ELF符号,可以使用plugin包在运行时查找并绑定ELF符号。

Go编译器能够使用build flag -buildmode = c-shared创建C风格的动态共享库。

从1.8版开始,Go插件功能只能在Linux上使用。 很有可能在将来的版本中发生变化。

plugin

Plugin

type Plugin即Golang加载的插件,与之有关的两个方法:

  • Open: 根据参数path提供的插件路径加载这个插件,并返回插件这个插件结构的指针*Glugin
  • Lookup: *Plugin的惟一方法,通过名称symName在插件中寻找对应的变量或方法,以Symbol的形式返回

Symbol

根据定义type Symbol interface{}Symbolinterface的别名,也就是说,我们可以从插件里面拿到任何类型的可导出元素。

插件实例

本例子有点复杂。

实现插件

插件代码的编写和普通的go模块代码一样,主要是package必须是 main。

类似c的头文件,定义一些数据

package data

type PluginData struct {
   
    Name	string
    Age		int
    Tel		string
}
var DataChan = make(chan PluginData)

记得函数名要大些不然无法被外部程序访问(init除外)

//testplugin.go
package main

import (
    "fmt"
    "data"
)

var Value int

var Pd data.PluginData


//init 函数的目的是在插件模块加载的时候自动执行一些我们要做的事情,
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值