亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

golang如何生成動態庫和靜態庫

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

golang如何生成動態庫和靜態庫?這篇文章運用了實例代碼展示,代碼非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

預備知識

  • plugin模式

  • 插件運行方式

  • go plugin包使用

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")
    }
    
}

到此為止, 關于golang生成動態庫和靜態庫有了一個基礎的認識, 但是對于具體的使用方法還是需要多加鞏固和練習,如果想了解更多相關內容,請關注億速云行業資訊。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

湘阴县| 邳州市| 咸阳市| 鄂托克前旗| 仙居县| 密山市| 日土县| 繁峙县| 遂平县| 德江县| 民权县| 孟津县| 上饶市| 龙游县| 方城县| 监利县| 太仆寺旗| 杭锦后旗| 乡城县| 社会| 易门县| 宁安市| 天气| 信丰县| 昌都县| 岢岚县| 运城市| 九龙县| 贵阳市| 武强县| 武夷山市| 清新县| 凉山| 承德县| 阿拉善盟| 威宁| 嫩江县| 康保县| 锡林浩特市| 纳雍县| 荥阳市|