Go言語のinit関数の役割と使い方!プログラム起動時の初期化処理
生徒
「Go言語で、プログラムを動かす前に何か初期設定をしておきたいんですが、そういうことってできますか?」
先生
「はい、Go言語にはinit関数という、プログラム起動時に自動的に実行される特別な関数があります。」
生徒
「特別な関数?普通の関数と何が違うんですか?」
先生
「それでは、init関数の使い方や特徴を、これから丁寧に説明していきましょう!」
1. Go言語のinit関数とは?
Go言語のinit関数は、プログラム開始前(パッケージの初期化段階)に自動で一度だけ実行される特別な関数です。つまりmain関数より前に走り、グローバル変数の初期化が終わった直後に呼ばれます。
ポイントは次のとおりです。自分で呼び出さない/呼び出せない、引数・戻り値は持てない、関数名は必ずinitという3点です。ファイル内での詳しい数や順序の話は後述しますが、ここでは「起動準備を整える場所」と覚えてください。
init関数は、以下のような場面で使われます:
- データや定数の初期設定(デフォルト値の用意)
- 外部ファイルや環境変数の読み込み確認
- ログ出力の初期設定やタイムゾーンなどの環境構築
- 軽いキャッシュ作成や簡単な接続準備
ミニサンプル(動作のイメージ):
「起動準備ができたか」をinitで用意し、mainで利用します。
package main
import "fmt"
var ready bool // プログラム全体で使うフラグ
func init() {
// ここは自動で一度だけ実行される(手動では呼び出せない)
ready = true
}
func main() {
if ready {
fmt.Println("起動準備OK(initで初期化済み)")
}
}
このようにinitは、「mainの前に必ず動く初期化専用フック」として、Goのプログラムを安定して立ち上げるために役立ちます。
2. init関数の基本的な書き方
init関数の書き方はとてもシンプルです。次のように書くだけでOKです。
package main
import "fmt"
func init() {
fmt.Println("初期化処理を実行します")
}
func main() {
fmt.Println("メイン関数の処理です")
}
このコードを実行すると、init関数の中身がmain関数よりも先に実行されます。
実行結果は以下のようになります。
初期化処理を実行します
メイン関数の処理です
3. init関数はどこで使える?
init関数は、mainパッケージだけでなく、他のパッケージでも使えます。例えば、別のファイルやモジュールでinit関数を書いておくと、そのパッケージがインポートされたときに自動で実行されます。
たとえば、設定用のファイルでinit関数を使って、事前に必要な初期化処理を行うことができます。
4. init関数は複数定義できる?
はい、init関数は1つのファイルに複数定義することが可能です。また、同じパッケージ内の複数ファイルにもそれぞれinit関数を書くことができます。
複数のinit関数がある場合、Go言語はそれらを上から順に実行します。ただし、どの順番で実行されるかはファイルの読み込み順に依存するため、順番に依存したロジックは避けましょう。
5. init関数で気をつけたいポイント
init関数は便利ですが、使いすぎるとコードが読みにくくなることがあります。以下の点に注意しましょう。
- 複雑な処理を
initに書かない:読み手がどこで何が起きているか分かりにくくなります - 処理の順番に依存しないようにする:init関数の実行順序は保証されていません
- テストが難しくなる:自動実行されるため、意図しないタイミングで実行されてしまうことがあります
6. init関数を使った実用的な例
例えば、プログラムの起動時に初期設定ファイルを読み込んだり、データベースとの接続を確立するような処理もinit関数で行うことができます。
package main
import (
"fmt"
)
var config string
func init() {
config = "初期設定を読み込みました"
fmt.Println("設定中...完了!")
}
func main() {
fmt.Println("現在の設定:", config)
}
実行すると、init関数で先に設定が行われ、その後にmain関数が動作していることがわかります。
設定中...完了!
現在の設定: 初期設定を読み込みました
7. Go言語での初期化処理を学ぶメリット
Go言語でinit関数を使いこなすと、プログラムの立ち上げがスムーズになります。たとえば、Webアプリケーションやゲームなどでは、最初に必要なデータを読み込んだり、環境を整える必要があります。
そうした場面でinit関数を使えば、main関数の中をスッキリと保つことができ、可読性の高いコードを書けるようになります。
まとめ
Go言語のinit関数は、プログラムが動く前に一度だけ自動で実行される特別な初期化処理です。最初に設定しておきたい値やデータを準備したり、環境を整えるためにとても便利です。Webアプリケーションやゲーム開発だけでなく、ちょっとしたツールや小さなプログラムでも、最初に必要なデータを用意しておくと、後の処理が分かりやすくなります。学習の段階では軽い準備だけでも十分ですが、実際の開発では設定ファイルを読み込んだり、接続先の準備をしたり、初期値を作ったりと、さまざまな場面で活用されています。init関数は、自分で呼び出さなくてもGoが自動で動かしてくれるため、コードがゴチャゴチャしにくく、見通しが良くなります。書き方も難しくなく、ただfunc initを用意するだけで使えるので、初心者でも安心して取り入れることができます。同じパッケージに複数のinit関数があっても問題なく、自動的に上から順番に実行されます。ただし、処理順に依存しすぎると読みづらいコードになってしまうので、「準備はしたいけれど簡潔に」という意識を持つと良い習慣になります。ログ設定や定数の初期化など、ほんの少しの準備であっても、後で読み返したときにコードを追いやすくなるため、特に複数人で作業するときには役立ちます。ソースコードの手前で静かに動き、必要な環境を整えてくれるので、ちょうど裏方のような存在といえるでしょう。
下のサンプルでは、init関数であらかじめデータを作っておき、main関数でそれを使う流れが確認できます。プログラムが起動すると、まずinitが処理され、次にmainで実行されます。どれだけファイルが増えても、Go言語のルールに従って正しく自動実行されるため、安全な初期化が可能です。自動で処理が行われる魅力を活かして、設定や準備を一か所にまとめるようにすると、管理しやすく初めて書いた人でも理解しやすいコードになります。特にWebのAPIやファイル処理、データ読み込みを行う場合には、initで準備してmainで利用する形がよく使われます。初期化処理をmainから分離できることで、メイン処理がすっきりと読みやすくなり、自然とプログラムの構造も整います。こうした小さな工夫が積み重なることで、後からコードを読む人にも親切なプログラムになります。学習の段階でも、initの動作を確認しておくと、複雑な処理に挑戦したときに役に立ちます。まずは変数の初期化や簡単なメッセージ表示から試してみて、どういう順番で動くのか体感してみてください。
ミニサンプルコードで振り返り
package main
import "fmt"
var message string
func init() {
message = "起動前に準備完了"
fmt.Println("init関数で初期化しました")
}
func main() {
fmt.Println("メイン処理を開始します")
fmt.Println(message)
}
このプログラムでも、init関数が自動で先に実行され、設定したメッセージをmainで利用できます。もしinit関数がなければ、mainの中で準備を毎回書く必要があり、長くなるほど見通しが悪くなります。最初に設定しておきたい値はinitでまとめておくと、あとから処理を追うときに理解しやすくなるため、初心者でも整理されたコードになります。
生徒
「init関数って、知らないうちに動いてくれる裏方みたいな存在なんですね」
先生
「その通りです。自分で呼び出さなくても、必ず最初に一度だけ動いてくれます」
生徒
「毎回main関数で準備を書くよりも、分かりやすく整理できそうです!」
先生
「まさにそこがinitの良いところです。設定や初期の読み込みを一か所にまとめるだけで、コードを読む人も理解しやすくなります」
生徒
「小さなプログラムでも使っていいんですか?」
先生
「もちろんです。小さな初期化でもOKですし、大きなシステムでも役に立ちます」
生徒
「なるほど、では次のプログラムでも使ってみます!」