Skip to content

Instantly share code, notes, and snippets.

@mackee
Last active September 29, 2015 09:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mackee/6145a8e36067ea02b919 to your computer and use it in GitHub Desktop.
Save mackee/6145a8e36067ea02b919 to your computer and use it in GitHub Desktop.
Goにおけるpluginの実装について(in 1.5)

Goにおけるpluginについて

前提

  • ここでのplugin = dynamic loading
  • Goでは現在のところ動的ローディングがまっとうな方法では出来ない
  • 以下ではまっとうではない方法というのを説明する

方法

  1. 他の言語で作ったライブラリをロードする
  2. C言語(や他の言語で作った.so)をcgoでロードする
  3. GoにLLのインタプリタを組み込んでLLで書かれたプラグインをロードする
  4. 別プロセスとして立ち上げてその間をプロセス間通信する
  5. os/execでコマンドを立ち上げて標準出力に出てきた結果を利用する
  6. os/execでnet/rpcをしゃべるサーバーを立ち上げてRPC通信を行う
  7. 上記のことをうまいことやってくれるパッケージを使う

1. 他の言語で作ったライブラリをロードする

1-1 C言語(や他の言語で作った.so)をcgoでロードする

http://mattn.kaoriya.net/software/lang/go/20130805173059.htm

1-2 GoにLLのインタプリタを組み込んでLLで書かれたプラグインをロードする

1-3 Goをshared libraryとしてコンパイルしてcgoでロードする

  • おっと。。。

2. 別プロセスとして立ち上げてその間をプロセス間通信する

  • こっちのほうが主流っぽい

2-1 os/execでコマンドを立ち上げて標準出力に出てきた結果を利用する

2-2 os/execでnet/rpcをしゃべるサーバーを立ち上げてRPC通信を行う

2-3 上記のことをうまいことやってくれるパッケージを使う

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment