結論から言うと、import される順番に依存する。
以下のような main での import を例にすると、
first の init() が呼ばれた後に
second の init() が呼ばれる。
package main import ( myapp/first //最初に呼ばれる myapp/second //次にこれが呼ばれる ) func main() { }
仮に first の中で second が import されていたとすると、
first package で second の init() が呼ばれるので、
second の init() が最初に呼ばれる。
例えば、a, b という package があって・・・・
package a func init() { if b.Value == 100 { //何かしらの処理 } }
package b var Value int func init() { b.Value = 100 }
a の init() で b の init() 内で初期化される変数を参照していても、
a が b を import している限り、b の init() が先に実行されることが保証されている。
これによって、
「このパッケージの init() が最初に実行されないと上手く初期化されない」
ってことを心配する必要はなくなる。
init() 同士に依存関係があっても特に意識しなくていい。
ちなみに、同一パッケージで複数の init() を定義することもできるので、
その場合の実行順もサラッと調べた。
http://qiita.com/astronoka/items/aa2f271d280863cedf5e
http://stackoverflow.com/questions/24790175/when-is-the-init-function-in-go-golang-run
ただ、これは意識する必要ないと思っている。
なぜかというと、同一パッケージに複数に init() を定義して、
それらが依存しているのって、
パッケージの設計(粒度)がおかしい気がするので、
見直したほうがいいかと。
こちらも import に関する記事です。
pospome.hatenablog.com