91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

裕民县| 神木县| 保定市| 佳木斯市| 贺州市| 闵行区| 定西市| 安阳市| 肃宁县| 常德市| 务川| 无为县| 皮山县| 昭苏县| 历史| 平定县| 崇义县| 广南县| 中西区| 太湖县| 花垣县| 威信县| 翁源县| 寿光市| 遵义县| 綦江县| 潜江市| 宁安市| 珲春市| 武强县| 特克斯县| 会理县| 仁怀市| 三门峡市| 桐城市| 翼城县| 平南县| 沈阳市| 深圳市| 额敏县| 淅川县|