第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

Golang筆記-Plugin初探

標(biāo)簽:
Go

前言

最近在学习fabric 1.2版本的新特性,其中有一个是实现了交易背书和区块结果验证这两个原本由系统链码esccvscc负责的模块的可插拔。它们的可插拔用到了Go的plugin技术,这也是我第一次知道Go Plugin的概念(虽然在Go 1.8版本就有了),于是准备探一探究竟Go Plugin是什么,怎么用。

什么是Go Plugin

Golang是静态编译型语言,在编译时就将所有引用的包(库)全部加载打包到最终的可执行程序(或库文件)中,因此并不能在运行时动态加载其他共享库。Go Plugin提供了这样一种方式,能够让你在运行时动态加载外部功能。

为什么用Go Plugin

其实应该问为什么要用Plugin,我觉得原因有很多,比如:

  • 可插拔:有了Plugin,我的程序可以根据需要随时替换其中某些部件而不用修改我的程序;

  • 动态加载的需要:有些模块只有在运行时才能确定,需要动态加载外部的功能模块;

  • 独立开发:Plugin 可以和主程序独立建设,主程序只需要制定好框架,实现默认(模版)功能。Plugin 可根据用户需求随时自行扩展开发,运行时随意替换,提高了程序的可定制性;

怎么用Go plugin

Golang 对 Plugin 的实现在标准库plugin中。整个接口可以说相当简洁了。

type Plugin struct{ ... }    func Open(path string) (*Plugin, error)
    func (p *Plugin) Lookup(symName string) (Symbol, error)type Symbol interface{}

是的,你没有看错,就只有两个type和两个方法。

Plugin

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

  • Open: 根据参数path提供的插件路径加载这个插件,并返回插件这个插件结构的指针*Glugin

  • Lookup: *Plugin的惟一方法,通过名称symName在插件中寻找对应的变量或方法,以Symbol的形式返回

Symbol

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

小试牛刀

了解了plugin包的基本功能,按照惯例,我们要用hello world检验下。
准备plugin源码pluginhello.go

package mainimport (    "fmt")func Hello() {
    fmt.Println("Hello World From Plugin!")
}

这里在插件中,定义了一个可导出方法Hello打印Hello World From Plugin!
有了源码,怎样将他编译成一个插件呢?

  plugin go1.10 build --buildmode=plugin -o pluginhello.so pluginhello.go
  plugin ls
invokeplugin.go pluginhello.go  pluginhello.so

go build命令,同时制定buildmodeplugin即可。So Easy!
注意:这里尤其要注意的是,plugin的源码需要在main包中,否则无法编译。

下面该调用这个插件了:

package mainimport (    "fmt"
    "os"
    "plugin")func main() {
    p, err := plugin.Open("./pluginhello.so")    if err != nil {
        fmt.Println("error open plugin: ", err)
        os.Exit(-1)
    }
    s, err := p.Lookup("Hello")    if err != nil {
        fmt.Println("error lookup Hello: ", err)
        os.Exit(-1)
    }    if hello, ok := s.(func()); ok {
        hello()
    }
}

首先通过Open方法打开插件,然后通过名称Hello找到插件中的func Hello方法。
注意,由于从插件中找到的任何元素都是以Symbol形式(即interface{})返回,我们需要通过断言的形式对结果进行判断和转换,得到我们需要的类型。
让我们看看效果吧:

  plugin go1.10 run invokeplugin.go
Hello World From Plugin!

完美调用了插件!

说明: Go 1.8时 Plugin 支持Linux和macOS,但是因为bug在1.9取消了对macOS的支持,1.10时又恢复了对macOS的支持。
我的机器上因为装了多个版本,而开发需要常用的是go 1.9,所以这里使用go 1.10时,命令用的go1.10这个软连接



作者:tinywell
链接:https://www.jianshu.com/p/4ab799081a99

點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評(píng)論
  • 收藏
  • 共同學(xué)習(xí),寫下你的評(píng)論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消