プラグインベースのアプリケーションで使用するために動的に実行できますか?
Eclipseでは、Eclipseが動的に実行できるプラグインをいくつか作成できます。
Goでも同じことが可能でしょうか?
これらは2つの別々の問題であると主張します:
最初のものは単純に no です: Go プログラムは静的にリンクされています。つまり、実行中のプログラムにコードを追加することはできません。また、プラグインを統合できるようにプログラムをコンパイルする必要があることも意味します。
幸いなことに、ほとんどの言語と同様に、Go でもプラグインを受け入れるプログラムを定義できます。Go はインターフェイスと高速なコンパイルを備えているため、その作業は難しくありません。
2 つの可能なアプローチを次に示します。
解決策 1 : メイン プログラムに統合されたプラグイン
Eclipse プラグインと同様に、プログラムを再コンパイルするだけで、「プラグイン」をメイン プログラム メモリに統合できます。この意味で、たとえば、データベース ドライバーはプラグインであると言えます。
再コンパイルが必要で、コードのある時点で「プラグイン」をインポートする必要があるため、これは Java ほど単純ではないかもしれません (データベース ドライバーの場合の方法を参照してください)。ただし、ディレクトリとインポートに関する Go の標準化を考慮すると、 、プラグインをインポートしてアプリケーションを再コンパイルする単純なメイクファイルで簡単に処理できるようです。
Go でのコンパイルの容易さと速度、およびパッケージ構造の標準化を考えると、これは非常に実行可能なソリューションのように思えます。
解決策 2 : 別のプロセス
Go での通信と非同期呼び出しの処理は特に簡単です。つまり、名前付きパイプ (または任意のネットワーク ソリューション) によって通信する多くのプロセスに基づいてソリューションを定義できます。Go にはrpc パッケージがあることに注意してください。これはおそらくほとんどのプログラムにとって十分に効率的であり、メイン プログラムはプラグイン プロセスを開始および停止できます。これは、メモリ空間保護の利点が追加された Eclipse と非常によく似ています。
いくつかの Eclipse プラグインを作成した人からの最後のメモ: 混乱は望ましくありません。複雑にしないでおく。
Go 1.8 はプラグインをサポートします (2017 年 2 月にリリース予定)。
dystroy が既に述べたように、実行時にパッケージをロードすることはできません。
将来 (または制限付きで今日) のようなプロジェクトでこの機能を使用できるようになる可能性がありますgo-eval
。これは、「Go のインタープリターの始まり」です。
これを行うために見つけたいくつかのパッケージ: