您好,登錄后才能下訂單哦!
golang如何生成動態(tài)庫和靜態(tài)庫?這篇文章運用了實例代碼展示,代碼非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
預備知識
plugin模式
插件運行方式
go plugin包使用
go build 可以指定buildmode。分為了多種模式。具體模式如下。
模式 | 說明 |
---|---|
當前go版本 | 1.10.3 |
archive | 編譯成二進制文件。一般是靜態(tài)庫文件。 xx.a |
c-archive | 編譯成C歸檔文件。C可調(diào)用的靜態(tài)庫。xx.a。注意要編譯成此類文件需要import C 并且要外部調(diào)用的函數(shù)要使用 “//export 函數(shù)名” 的方式在函數(shù)上方注釋。否則函數(shù)默認不會被導出。 |
c-shared | 編譯成C共享庫。同樣需要 import “C” 和在函數(shù)上方注釋 // export xxx |
default | 對于有main包的直接編譯成可執(zhí)行文件。沒有main包的,編譯成.a文件 |
exe | 編譯成window可執(zhí)行程序 |
plugin | 將main包和依賴的包一起編譯成go plugin。非main包忽略?!绢愃艭的共享庫或靜態(tài)庫。插件式開發(fā)使用】 |
實例
結(jié)構(gòu): -softplugin //根目錄 -soft //軟件目錄 -plugins //插件目錄 -itf //接口目錄
無自定義數(shù)據(jù)
// 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") } }
到此為止, 關(guān)于golang生成動態(tài)庫和靜態(tài)庫有了一個基礎(chǔ)的認識, 但是對于具體的使用方法還是需要多加鞏固和練習,如果想了解更多相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。