2016この記事はQiitaの記事をエクスポートしたものです。内容が古くなっている可能性があります。はじめに知られているようで、案外知られてないことをQiitaに投稿していくのも良いと思い、軽いネタですがinit関数についてまとめたいと思います。init関数とはinit関数は特殊な関数で、パッケージの初期化に使われます。以下のようにmainパッケージに書くとmain関数より先に実行されます。mainパッケージでない場合は、importするだけで呼び出されます。main")}Playgroundで動かすinit関数は何に使うのか?上記では、初期化に使うと書きました。名前からしてそれは想像できますよね。init関数は基本的にはパッケージ変数の初期化に用いられます。何かしらの副作用をパッケージに変数に与えなければ、呼んでも意味がないからです。外部のリソースに何かしらの副作用を与える場合(サーバに何かリクエストしたり、ファイルに書き込んだり)もありますが、基本的にはパッケージ変数の初期化に使われます。パッケージ変数は、代入文でも初期化を行うことがありますが、以下のような場合にinit関数を使います。playgroundと出るのはなんとなく空気を読めばわかりますが、よく見るとパッケージ変数の初期化の方が先に実行されていることが分かります。main関数より先に実行されています。playground")}Playgroundで動かす言語仕様を読む限り、依存するパッケージがある場合(import文がある場合)には、それらのパッケージの初期化が終わった後に自身のパッケージのinit関数が実行されるようです。init関数はいくつ書けるのか?よくよく考えると、複数ファイルにまたがって、1つのパッケージに複数のinit関数を書いていることがあるのに気づくことがあります。他の関数の場合は、複数定義すると、もちろんコンパイルエラーになります。ちなみに、ファイルに1つという決まりもなく、複数書けるようになっています。{}Playgroundで動かす不思議ですね。runtimeパッケージを使って関数名がどうなっているのか調べてみましょう。runtime.FuncForPC(pcs[0])fmt.Println(fn.Name())}Playgroundで動かす実行すると、以下のように出力されます。main.init.1main.init.2main.mainどうやら、各init関数には番号が付けられており、区別されているようです。main関数から呼び出してみます。{init()}Playgroundで動かす実行すると、以下のようにエラーがでます。init定義されていないことになるようです。!おわりにinit関数についてまとめてみました。ちなみに、この記事を書こうと思った元ネタはこちらです。CoderPortfolio.。