- ここでのplugin = dynamic loading
- Goでは現在のところ動的ローディングがまっとうな方法では出来ない
- 一つのGoプログラムから別のGoプログラムを動的ローディングする仕組みは無い
- 検討はされているみたいだ
- https://docs.google.com/document/d/1nr-TQHw_er6GOQRsF6T43GGhFDelrAP0NqSS_00RgZQ/edit?pli=1
- -buildmode=pluginというのがあり、1.5でも生えてはいるがno implemented
- 以下ではまっとうではない方法というのを説明する
- 他の言語で作ったライブラリをロードする
- C言語(や他の言語で作った.so)をcgoでロードする
- GoにLLのインタプリタを組み込んでLLで書かれたプラグインをロードする
- 別プロセスとして立ち上げてその間をプロセス間通信する
- os/execでコマンドを立ち上げて標準出力に出てきた結果を利用する
- os/execでnet/rpcをしゃべるサーバーを立ち上げてRPC通信を行う
- 上記のことをうまいことやってくれるパッケージを使う
http://mattn.kaoriya.net/software/lang/go/20130805173059.htm
-
例えばluaとかmrubyとかjavascript
-
メリットはこの後出る方法と違って1プロセス内で収まる
-
デメリットとしてそもそもGoでは書けないし・・・というのがある
- goの機能にアクセス出来ないとかもあるかも。gopher-luaはgoroutineなどには対応しているみたい
- おっと。。。
- こっちのほうが主流っぽい
- mackerl-agentなどが採用している方法
- お手軽 フォーマットをちゃんと決めればgo以外のプログラムも使える