預備知識
plugin模式
外掛程式運作方式
go plugin套件使用
相關知識(建議:go語言教學)
go build 可以指定buildmode 。分為了多種模式。具體模式如下。
模式 | 說明 |
---|---|
目前go版本 | 1.10.3 |
archive | #編譯成二進位檔案。一般是靜態庫文件。 xx.a |
c-archive | 編譯成C歸檔檔。 C可調用的靜態函式庫。 xx.a。注意要編譯成此類檔案需要import C 並且要外部呼叫的函數要使用 “//export 函數名稱” 的方式在函數上方註解。否則函數預設不會被導出。 |
c-shared | 編譯成C共享函式庫。同樣需要 import “C” 和在函數上方註釋 // export xxx |
#default | 對於有main套件的直接編譯成可執行檔。沒有main套件的,編譯成.a檔 |
exe | 編譯成window可執行程式 |
plugin | 將main套件和依賴的套件一起編譯成go plugin。非main包忽略。 【類似C的共享庫或靜態庫。外掛程式開發使用】 |
實例
结构: -softplugin //根目录 -soft //软件目录 -plugins //插件目录 -itf //接口目录
無自訂資料
// plugins/hello.go package main import "fmt" func Hello(){ fmt.Println("hello") } // go build -buildmode=plugin -o hello.so hello.go // soft/basetype.go package main import ( "os" "path" "plugin" "fmt" ) func main(){ //加载插件 pluginDir := "../plugins" //扫描文件夹下所有so文件 f, err := os.OpenFile(pluginDir, os.O_RDONLY, 0666) if err != nil { panic(err) } fi, err := f.Readdir(-1) if err != nil { panic(err) } plugins := make([]os.FileInfo, 0) for _, ff := range fi { if ff.IsDir() || path.Ext(ff.Name()) != ".so" { continue } plugins = append(plugins, ff) pdll, err := plugin.Open(pluginDir + "/" + ff.Name()) if err != nil { fmt.Println(err) continue } plg, err := pdll.Lookup("Hello") if err != nil { panic(err) } plg.(func())() } } // go run basetype.go
定義外掛介面 interface。
//------------------------------------------------------ // itf/itf1.go package itf type Printor interface{ Print(v interface{}) } //------------------------------------------------------ // plugins/p1.go package main import ( "fmt" "softplugin/itf" ) type ScreenPrintor struct{} func (ScreenPrintor)Print(v interface{}){ fmt.Println("p1p1 ",v) } func Install() Printor{ return &ScreenPrintor{} } //----------------------------------------------------- // soft/s1.go package main import ( "softplugin/itf" "os" "path" "plugin" "fmt" ) var( printors = make([]itf.Printor, 0) ) func main(){ //加载插件 pluginDir := "../plugins" //扫描文件夹下所有so文件 f, err := os.OpenFile(pluginDir, os.O_RDONLY, 0666) if err != nil { panic(err) } fi, err := f.Readdir(-1) if err != nil { panic(err) } plugins := make([]os.FileInfo, 0) for _, ff := range fi { if ff.IsDir() || path.Ext(ff.Name()) != ".so" { continue } plugins = append(plugins, ff) pdll, err := plugin.Open(pluginDir + "/" + ff.Name()) if err != nil { fmt.Println(err) continue } plg, err := pdll.Lookup("Hello") if err != nil { panic(err) } printors = append(printors, (plg.(func() itf.Printor))()) } for _, p := range printors { p.Print("pppp") } }
以上是Go產生go動態函式庫或靜態函式庫的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!