LoginSignup
66
48

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-05-18

importについて

Go言語のperiod importとblank importについて調べてみました。
import全般の仕様は以下から確認できます。

period(.) import

Goプログラミング言語仕様のインポート宣言より引用

名前の代わりにピリオド(.)を指定したときは、インポートされたパッケージのパッケージブロックでエクスポートされている全識別子がインポートしたソースファイルのファイルブロックで宣言され、プレフィックスなしでアクセスできるようになります。

period importの仕様は上記の通り単純です。
ただし、以下の理由から利用はおすすめできません。

  • period importしたパッケージに含まれる関数と同名の関数を宣言できなくなる
  • どのパッケージの関数なのか分かりにくくなる

例外として「Go言語のパッケージのテストでプライベートな関数や変数を呼び出すには」で解説している使い方は非常に有用だと思います。

period importのサンプル

main.go
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のサンプル

main.go
package main

import (
    "fmt"

    _ "./blank"
)

func main() {
    fmt.Println("main")
}
blank/blank.go
package blank

import "fmt"

func init() {
    fmt.Println("blank/init")
}
実行結果
$ go run main.go
blank/init
main

追記

最終的に消すけど開発途中で消したくないimportがある場合にもblank importを使えます。
次のように全てのfmtをコメントアウトしてもimportでエラーになりません。

blank/foo.go
package main

import _ "fmt"

func main() {
    // fmt.Println("begin")
    anyFunction()
    // fmt.Println("end")
}
66
48
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
66
48