golangプラグインでgolangダイナミックライブラリをロード
2762 ワード
環境
システム: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プログラムの拡張性を別の段階に向上させ、プラグインを利用してサービスのホット更新を行うなど、よりクールなことをすることができます.