golangプラグインでgolangダイナミックライブラリをロード


環境


システム:linux(windows下golangはダイナミックライブラリをサポートしていないため、なぜか聞かないでください)golangバージョン:1.5以上ダイナミックライブラリをサポートし、1.8以上pluginをサポートします

プラグインコード


プラグインコードは普通のgolangモジュールコードと変わらないが、主にpackageはmainでなければならない.次は簡単なプラグインコードです.
//testplugin.go
package main

import (
    "fmt"
)

func init() {
    fmt.Println("world")
    // ,  platform.RegisterPlugin({"func": Hello})  , 
}

func Hello() {
    fmt.Println("hello")
}

Init関数の目的は、プラグインモジュールのロード時に、メソッドとタイプをプラグインプラットフォームに自動的に登録したり、プラグイン情報を出力したりするなど、私たちがしなければならないことを自動的に実行することです.
Hello関数は呼び出し側で明示的に検索する必要があるsymbolです

コンパイルコマンド

go build -buildmode=plugin testplugin.go

コンパイルが完了すると、現在のディレクトリの下にtestpluginが表示されます.soファイルは、次のようなコマンドで異なるバージョンのプラグインを生成することもできます.
go build -o testplugin_v1.so -buildmode=plugin testplugin.go

プラグインのバージョンをよりよく制御するには、ホットアップデートプラグインなど、よりクールなことをしたいです.では、自動登録方式を採用し、新しいバージョンのプラグインをロードした後、自動的にプラグインバージョン番号を登録し、プラグインプラットフォームで新しいバージョンを優先的に使用する方法を採用することができます.

使用


使用者はpluginというパッケージを導入する必要があります
//main.go
package main

import (
    "plugin"
)

func main() {
    p, err := plugin.Open("testplugin.so")
    if err != nil {
        panic(err)
    }   
    f, err := p.Lookup("Hello")
    if err != nil {
        panic(err)
    }   
    f.(func())()
}

しゅつりょく

$ go run main.go 
world
hello

プラグインのHelloメソッドを明示的に呼び出し、helloという文字列を印刷するだけですが、Helloを呼び出す前にworldが出力されています.これはプラグインinit関数がやったことです.

まとめ


golangサポートプラグインはgolangプログラムの拡張性を別の段階に向上させ、プラグインを利用してサービスのホット更新を行うなど、よりクールなことをすることができます.