0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Goのinit関数を理解する

0
Posted at

1. はじめに

この記事でわかること:

  • init() はいつ実行されるのか
  • main() との実行順序
  • 複数の init がある場合の挙動
  • 実務での使いどころ

2. 基本のサンプルコード

package main

import"fmt"

funcinit() {
	fmt.Println("init")
}

funcmain() {
	fmt.Println("main")
}

3. 実行結果

init
main

ポイント

  • init()mainより先に実行される
  • init()自動で呼び出される
  • 自分で init() を呼ぶことはできない
init() // コンパイルエラー

4. initとは何か?

init()パッケージの初期化処理 のための関数です。

実行順序は次の通り:

  1. パッケージ変数の初期化
  2. init() の実行
  3. main() の実行

5. initは複数書ける

1つのファイルに複数の init() を書くこともできます。

funcinit() {
	fmt.Println("init 1")
}

funcinit() {
	fmt.Println("init 2")
}

出力:

init 1
init 2
main

👉 同一ファイル内では 上から順番に実行される。


6. 別ファイルにある場合の実行順

  • 同一パッケージ内なら、すべての init() が実行される
  • 実行順はファイル名順になることが多い(コンパイラ依存の部分もある)

👉 つまり、init の実行順に依存した設計は避けるべき。


7. 何に使うのか?

init() の主な用途:

  • 設定の初期化
  • DB接続の初期化
  • 環境変数の読み込み
  • ログ設定

例:

funcinit() {
	fmt.Println("設定を読み込みました")
}

8. 使いすぎに注意

init() は便利ですが、

  • どこで呼ばれているか見えない
  • 依存関係が分かりづらい
  • テストしづらい

という欠点もあります。

👉 原則:

  • 必須の初期化のみ
  • ビジネスロジックは書かない

9. まとめ

  • init() は自動実行される特別な関数
  • main() より先に実行される
  • 複数書ける
  • 主に初期化処理に使う
  • 使いすぎると可読性が下がる

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?