Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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")
}
Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away