読者です 読者をやめる 読者になる 読者になる

Go の init() が呼ばれる順番

結論から言うと、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