前言:
最近在學習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
命令,同時制定buildmode
為plugin
即可。
呼叫示例:
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...