はじめに
本記事は以下のツイートの翻訳転載です。
アンダースコア(_
) Import
多くのライブラリで、時折、次のようにアンダースコア(_
)と組み合わせたimport文を見かけるかもしれない。
これは、名前参照をせずに、そのパッケージの初期化コード(init()
関数)を実行しています。
例としてunderscoreパッケージを作成しました。ここにはinit()
関数を定義してあります。
And in main(), using underscore import, even if I don't do anything, it still prints:
そしてmain()
関数にて、アンダースコアimportを使用すると、それ以外に何もしなくてもunderscoreパッケージのinit()
関数が実行されます。
おわりに
MySQLに接続する際などに見かけるなと思っていた。
import ( "database/sql" "time" _ "github.com/go-sql-driver/mysql" ) // ... db, err := sql.Open("mysql", "user:password@/dbname") if err != nil { panic(err) } // See "Important settings" section. db.SetConnMaxLifetime(time.Minute * 3) db.SetMaxOpenConns(10) db.SetMaxIdleConns(10)
アンダースコアimportはinit()
関数を実行する、と言うものなので、覚えやすいシンプルな機能かなと思う。
また、tools.goを導入する際も使うかもしれない。
気になったので実行順序を調べてみた。
package underscore
import "fmt"
func init() {
fmt.Println("underscore.go: init")
}
package main
import (
"fmt"
_ "sample/underscore"
)
func init() {
fmt.Println("main.go: init")
}
func main() {
fmt.Println("main.go: main")
}
# go run .
underscore.go: init
main.go: init
main.go: main