Go言語にて依存関係を解決するためのimportにはアンダースコア(ブランク識別子)を別名とする

golangを触っていてなんだこれって思ったのでメモしておく。

importのアンダースコア

サンプルコードを見ていてこんな記述を見かけた。
パッケージ名の前にアンダースコアが書かれている。

import (
    "fmt"
    _ "github.com/go-sql-driver/mysql" // <- 先頭のアンダースコアはなにもの?
)

なにこれ?

これはブランク識別子と呼ばれるもので、importしたパッケージと依存関係のあるパッケージをimportするときにこれを指定するらしい。
golangではimportしたパッケージをコード中で使用しないとコンパイルエラーとなるので、依存関係を解決するためのimportであることを明示してあげないといけない。

インポート宣言は、インポート「する側」と「される側」の依存関係を宣言します。自分自身のパッケージをインポートすること、またはインポートしたパッケージ内でエクスポートされている識別子を一切参照しないことは誤った使い方です。インポートによる副作用(初期化)のためだけにパッケージをインポートするときは、パッケージ名としてブランク識別子を使ってください。

Go言語仕様翻訳(part12) - golang.jp

いいわけ

正直、ちゃんと読み取れてるか自信ないので間違った解説をしているかも。

参考

The Go Programming Language Specification - The Go Programming Language
Go言語仕様翻訳(part12) - golang.jp

改訂2版 基礎からわかる Go言語

改訂2版 基礎からわかる Go言語