はじめに
他の人が書いたコードの中には_ "パッケージ名"
という構文があってよくわからなかったので調べてみた。
ブランクimportって?
ブランクインポート(_ "パッケージ名")は、Golangで特定のパッケージをインポートする際に使用される特殊な構文です。ブランクインポートは、パッケージ内のすべての宣言を無視し、パッケージの初期化のみを実行します。これは、パッケージが初期化関数(init関数)やサイドエフェクトを持っている場合に役立ちます。
Golangでは、通常のインポートとブランクインポートの2種類のインポート構文があります。
// 通常のインポート
import "fmt"
// ブランクインポート
import _ "github.com/lib/pq"
通常のインポートでは、インポートされたパッケージの公開された(エクスポートされた)名前(大文字で始まる名前)が、現在のパッケージ内で使用できるようになります。これにより、パッケージ内の関数、変数、型などを利用することができます。
ブランクインポートの場合、アンダースコア(_)がインポートとして使用され、インポートされたパッケージの名前が指定されます。この構文により、インポートされたパッケージのすべての宣言が無視され、パッケージ内の初期化関数(init()関数)のみが実行されます。
init()関数は、パッケージがインポートされたときに自動的に実行される特殊な関数です。パッケージ内に複数のinit()関数がある場合、それらは宣言順に実行されます。ブランクインポートは、init()関数を実行してパッケージ内のグローバルな状態やサービスを初期化することが主な目的です。
例えば、以下のような状況でブランクインポートが役立ちます。
- パッケージがプラグインやドライバーのようなものを提供し、それらをアプリケーション内で自動的に登録する場合
- パッケージが特定の環境変数や設定ファイルを読み込んで、内部の状態を初期化する場合
- パッケージがアプリケーション起動時に一度だけ実行する必要があるコード(例えば、データベースのマイグレーションやシードデータの投入)を含む場合
- ただし、ブランクインポートは、パッケージ内の初期化処理が不透明であるため、コードの可読性が低下する可能性があります。そのため、ブランクインポートは必要な場合にのみ使用し、適切なコメントやドキュメントでその目的や効果を明確にすることが推奨されます。
以下に、ブランクインポートを使用したサンプルコードを記載。
package main
import (
_ "database/sql"
_ "github.com/lib/pq"
"fmt"
)
func main() {
fmt.Println("Blank import example")
}
この例では、database/sqlパッケージとgithub.com/lib/pqパッケージがブランクインポートされています。これにより、それらのパッケージのinit関数が実行され、パッケージ内の他の宣言は無視されます。このようにして、必要な初期化や設定が行われることがあります。