首頁 >後端開發 >Golang >Go產生go動態函式庫或靜態函式庫的方法

Go產生go動態函式庫或靜態函式庫的方法

尚
轉載
2019-11-28 15:21:524998瀏覽

Go產生go動態函式庫或靜態函式庫的方法

預備知識

  • 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中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除