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関数は引数も戻り値も持たない固定の書式で、ファイル内のどこに置いてもかまいません。プログラム起動時にGoランタイムが自動で呼び出すため、mainから手動で呼ぶ必要はありません(そもそも呼べません)。まずは「起動前に一度だけ走る準備処理」として覚えましょう。
最小の書き方は次のとおりです。
package main
import "fmt"
// initは「()」「戻り値なし」で必ずこの形
func init() {
fmt.Println("初期化処理を実行します") // 設定準備・デフォルト値の用意など
}
func main() {
fmt.Println("メイン関数の処理です")
// initは自動実行されるため、ここから呼び出す必要はありません
}
このコードを実行すると、initの表示が必ず先に出ます。mainはその後に続きます。
実行結果(例):
初期化処理を実行します
メイン関数の処理です
ポイントまとめ:1) 書式はfunc init() { ... }だけ、2) 自動で一度だけ実行、3) ちょっとした準備(ログ設定やデフォルト値)に向いています。まずは上の最小サンプルで「順番」を体感してみてください。
3. init関数はどこで使える?
init関数はmainパッケージだけのものではありません。あらゆるパッケージで使え、そのパッケージが読み込まれたタイミングで自動実行されます。つまり、共通処理用のパッケージに初期設定をまとめておけば、main側は意識せずに準備済みの状態を使えます。
用途のイメージ:設定値の用意、簡単な検証、ログの初期設定、メッセージの準備など。「そのパッケージが提供する機能を安心して使える状態に整える」場所、と考えると分かりやすいです。
ミニサンプル(別パッケージでのinit):
// greeter/greeter.go
package greeter
var message string
// greeterパッケージが読み込まれたら自動で実行される
func init() {
message = "こんにちは、Goの世界!" // 機能を使う準備(デフォルト値など)
}
func Hello() string {
return message
}
// main.go
package main
import (
"fmt"
"example/greeter" // 自作パッケージをインポート
)
func main() {
// greeterのinitが先に実行され、messageが準備済み
fmt.Println(greeter.Hello())
}
この例では、greeterパッケージのinitが先に走ってメッセージを用意し、mainはHello()を呼ぶだけ。「パッケージ側で起動準備、利用側はシンプル」という役割分担が自然に作れます。
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ですし、大きなシステムでも役に立ちます」
生徒
「なるほど、では次のプログラムでも使ってみます!」
この記事を読んだ人からの質問
プログラミング初心者からのよくある疑問/質問を解決します
Go言語のinit関数は、main関数より先に必ず実行されるのですか?
はい。Go言語のinit関数はプログラム起動時に自動実行され、main関数より必ず先に呼び出されます。初期化処理や設定をmainより前に実行したい場合に便利です。
Go言語でinit関数を自分で呼び出す必要はありますか?
いいえ、呼び出しは不要です。init関数はGo言語が自動的に処理してくれるため、main関数に書かなくても自動で実行されます。
【超入門】ゼロから始めるGo言語プログラミング:最速で「動くアプリ」を作るマンツーマン指導
「プログラミングの仕組み」が根本からわかる。Go言語でバックエンド開発の第一歩を。
本講座を受講することで、単なる文法の暗記ではなく、「プログラムがコンピュータの中でどう動いているか」という本質的な理解につながります。シンプルながら強力なGo言語(Golang)を通じて、現代のバックエンドエンジニアに求められる基礎体力を最短距離で身につけます。
具体的な開発内容と環境
【つくるもの】
ターミナル(黒い画面)上で動作する「対話型計算プログラム」や、データを整理して表示する「ミニ・ツール」をゼロから作成します。自分の書いたコードが形になる感動を体験してください。
【開発環境】
プロの現場でシェアNo.1のVisual Studio Code (VS Code)を使用します。インストールから日本語化、Go言語用の拡張機能設定まで、現場基準の環境を一緒に構築します。
この60分で得られる3つの理解
「なぜ動くのか」という設定の仕組みを理解し、今後の独学で詰まらない土台を作ります。
データの種類やメモリの概念など、他言語にも通じるプログラミングの本質を学びます。
ただ動くだけでなく、誰が見ても分かりやすい「綺麗なコード」を書くための考え方を伝授します。
※本講座は、将来的にバックエンドエンジニアやクラウドインフラに興味がある未経験者のためのエントリー講座です。マンツーマン形式により、あなたの理解度に合わせて進行します。
初めてのGo言語を一緒に学びましょう!