6.6 静的なプラグイン機構を実現する

Goはコンパイルすると、外部に依存がほとんどない静的にリンクされたバイナリを生成します。このおかげでGoには、ポータビリティが高くコンテナでの利用やクラウドへのデプロイが簡単という特徴があります。

Javaや他の動的言語では、アプリケーションはそのままで動的に機能を追加したりカスタマイズする機構を提供するものがあります。Goの標準ライブラリのpluginパッケージを使ったプラグイン機能がありますが、対応OSが少なく(Linux、FreeBSD、macOS)、またアプリケーションとプラグイン側でライブラリのバージョンを揃える必要がある、プラグインもバイナリサイズが大きくなりがちなど、あまり使い勝手が良いとは言えず、活用されていません。

本節ではこのプラグイン機能の代わりとして利用されている、静的リンクを応用したプログラムの拡張方法について紹介します。

6.6.1 プラグイン機能の要件

プラグイン機能は、本体側にすべての機能を盛り込むとバイナリサイズが大きくなってしまう場合などに使われます。たとえば、外部へのファイルのアップロード機能を追加しようとしたとして、HTTP、FTP、AWS S3、Google Cloud Storage、Azure Blobなど、ありとあらゆる方式に対応すると、大量のランタイムがリンクされます。必要な機能だけ選択できれば、バイナリを小さくできます。

また、利用者側で新しい方式を追加できるようにすることで、元となっている機能の開発者がありとあらゆる要件に最初から対応する必要がなくなります。

前者はどちらかというと、プラグインとそれを利用するミドルウェアの開発者が同一のケースです。後者はプラグインの開発者とミドルウェアのユーザーが同一のケースです。どちらにしても、ミドルウェアの外から機能が選択できるところに意味があります。 ...