溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

golang如何生成動態(tài)庫和靜態(tài)庫

發(fā)布時間:2020-06-23 10:25:43 來源:億速云 閱讀:704 作者:Leah 欄目:編程語言

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è)資訊。

向AI問一下細節(jié)

免責聲明:本站發(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)容。

AI