GO1.8特性---plugin(goダイナミックライブラリ)

1848 ワード

概要:go 1.8が登場するまで,go言語はC/C++のようにダイナミックライブラリを用いてサービスを動的に変更することはできないと考えられていた.アップグレード操作のたびに、プロジェクト全体を再コンパイルし、サービスを再配置する必要があります.これは多くの比較的重いサービスにとって致命的な弱点である.現在go 1.8 linuxとDarwinシステムの下でのみpluginをサポートする.go 1から8ソースコードのpluginパッケージのplugin.goファイルの先頭に対応する説明があります.go 1.8のpluginパッケージはオペレーティングシステムのサポートが不十分であり、linuxシステムの下でも特定のgccのコンパイラおよびコネクタのサポートが必要である.後続のバージョンでは、対応する改善が行われるはずです.提供方法を作成するファイルprintを使用します.go
package main 

import (
    "fmt"
)

func PrintTest(strInput string) {
    fmt.Println("string in print.so is:", strInput)
}

コンパイルgoダイナミックライブラリコマンド:go build-buildmode=plugin指定ファイルコンパイルgoダイナミックライブラリコマンドgo build-buildmode=plugin-o print.so print.go
goダイナミックライブラリメソッドの使用(main.go):
package main

import (
    "plugin"
)

func main() {
    //     
    pdll, err := plugin.Open("print.so")
    if err != nil {
        //...
        return 
    }
    //       
    funcPrint, err := pdll.Lookup("PrintTest")
    if err != nil {
         //...
         return
    }
    //       
    funcPrint.(func(string))("hello go plugin")
    return
}

go1.8のpluginパッケージでは、動的ライブラリを開く方法と動的ライブラリを取得する方法に対応するOpenメソッドとLookupメソッドのみが提供されます.取得したダイナミックライブラリメソッドは、interface{}タイプであり、変換して使用する必要があります.