Golang 筆記之Plugin介紹

2021-10-25 02:43:21 字數 1670 閱讀 5820

前言:

最近在學習fabric 2.1 版本原始碼,其中在endorsersupportimpl 結構中使用了go的plugin 技術。所以這裡準備記錄下go plugin 是什麼,怎麼用。這裡部分參考了 的介紹(特記錄並表示感謝)

golang是靜態編譯型語言,在編譯時就將所有引用的包(庫)全部載入打包到最終的可執行程式(或庫檔案)中,因此並不能在執行時動態載入其他共享庫。go plugin提供了這樣一種方式,能夠讓你在執行時動態載入外部功能。

其實應該問為什麼要用plugin,我覺得原因有很多,比如:

golang 對 plugin 的實現在標準庫plugin中。整個介面可以說相當簡潔了。

type plugin struct

func open(path string) (*plugin, error)

func (p *plugin) lookup(symname string) (symbol, error)

type symbol inte***ce{}

我們可以發現只有兩個方法還是很簡單的。

typeplugin即golang載入的外掛程式,與之有關的兩個方法:

示例:了解了plugin包的基本功能,按照慣例,我們要用hello world檢驗下。

準備plugin原始碼pluginhello.go

package main

import (

"fmt"

)// plugin 原始碼必須在main 包中

func hello()

這裡在外掛程式中,定義了乙個可匯出方法hello列印hello world from plugin!

編譯為可執行程式:

go build --buildmode=plugin -o pluginhello.so pluginhello.go
go build命令,同時制定buildmodeplugin即可。

呼叫示例:

package main

import (

"fmt"

"os"

"plugin"

)func main()

s, err := p.lookup("hello")

if err != nil

if hello, ok := s.(func()); ok

}

首先通過open方法開啟外掛程式,然後通過名稱hello找到外掛程式中的func hello方法。

注意,由於從外掛程式中找到的任何元素都是以symbol形式(即inte***ce{})返回,我們需要通過斷言的形式對結果進行判斷和轉換,得到我們需要的型別。

讓我們看看效果吧:

go run invokeplugin.go

//列印

hello world from plugin!

成功!!!

golang學習筆記之 context詳細理解篇

17 27 52 上班 17 27 54 上班 17 27 56 上班 17 27 58 上班 17 28 00 上班 17 28 02 下班 17 28 02 無腦發呆中 package main import context log os time var logg log.logger fun...

學習筆記 Golang起步之HelloWord

進入官網 以mac終端為 zsh為例,輸入下面命令 vi zshrc在最後追加下面 users quaint study golang study 為你的golang 工作空間,該空間下應該包含3個資料夾 src pkg bin root 為go安裝目錄 path 為go工作空間 export go...

QT之外掛程式Plugin生成與使用

有時候,我們在做乙個應用程式的時候,並不希望我們生成的軟體僅僅是乙個exe檔案,而是拆分成各個模組,越細越好。在未來更新發布中,都是非常的便利,我們更新的只是其中某一小部分,而不是整個應用程式。說到這裡,我們看 吧 我們先定義乙個介面標頭檔案plugindemoplugin.h qt begin n...