6.7 初期化の順序を制御する

パッケージローカルで定義した変数は、そのパッケージの関数から呼び出す前には必ず初期化されています。これは利用側からするとごく自然なことですが、よく考えてみると不思議なことです。パッケージは、ほかのパッケージをインポートしますし、ほかのパッケージの要素を初期化時に呼び出すことさえできます。init()という名前の関数はmain()の前に呼び出されます。もし、初期化の順序計算がおかしく、実行までに正しく初期化が行われていなかったとすると、あっという間にエラーが発生して、かなりわかりにくいバグの修正を強いられることになるでしょう。

Goの初期化処理は、その実行順序含めて正しく行われるので、難しい点はなく気にすることも特にないのですが、前述の静的なプラグイン機構を使う場合には順序が問題となることがあります。

本節では、まずGoのパッケージ読み込み順序を説明した後に、最速でimportさせる方法を紹介します。

6.7.1 パッケージの読み込み順

caution

Goの言語仕様ではパッケージの読み込み順序について定義されていないため、ここで紹介する内容は将来的に変更される可能性があります。執筆時点での挙動です。

Goはimportをみて、深さ優先で探索を行います。

どんな環境であっても、Goのプログラムにはmainパッケージがあります。プログラムが実行される起点はここになります。例として、3つのサブパッケージからなるプロジェクトを作ってみましょう。それぞれのパッケージには自分の関数名をダンプするだけの ...