DEV Community

KOGA Mitsuhiro
KOGA Mitsuhiro

Posted on • Originally published at qiita.com

Go言語のperiod(.) importとblank(_) importについて

#go

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")
}

Top comments (0)