importについて
Go言語のperiod importとblank importについて調べてみました。
import全般の仕様は以下から確認できます。
period(.) import
Goプログラミング言語仕様のインポート宣言より引用
名前の代わりにピリオド(.)を指定したときは、インポートされたパッケージのパッケージブロックでエクスポートされている全識別子がインポートしたソースファイルのファイルブロックで宣言され、プレフィックスなしでアクセスできるようになります。
period importの仕様は上記の通り単純です。
ただし、以下の理由から利用はおすすめできません。
- period importしたパッケージに含まれる関数と同名の関数を宣言できなくなる
- どのパッケージの関数なのか分かりにくくなる
例外として「Go言語のパッケージのテストでプライベートな関数や変数を呼び出すには」で解説している使い方は非常に有用だと思います。
period importのサンプル
package main
import . "fmt"
func main() {
Println("period import")
}
$ go run main.go
period import
blank(_) import
Goプログラミング言語仕様のインポート宣言より引用
インポート宣言は、インポート「する側」と「される側」の依存関係を宣言します。自分自身のパッケージをインポートすること、またはインポートしたパッケージ内でエクスポートされている識別子を一切参照しないことは誤った使い方です。インポートによる副作用(初期化)のためだけにパッケージをインポートするときは、パッケージ名としてブランク識別子を使ってください。
こちらはinit関数だけを実行する場合に使う事ができます。
Effective Go / Import for side effectではHTTPのデバッグのためにnet/http/pprof
パッケージを利用する方法が挙げられています。
blank importのサンプル
package main
import (
"fmt"
_ "./blank"
)
func main() {
fmt.Println("main")
}
package blank
import "fmt"
func init() {
fmt.Println("blank/init")
}
$ go run main.go
blank/init
main
追記
最終的に消すけど開発途中で消したくないimportがある場合にもblank importを使えます。
次のように全てのfmt
をコメントアウトしてもimportでエラーになりません。
package main
import _ "fmt"
func main() {
// fmt.Println("begin")
anyFunction()
// fmt.Println("end")
}