Golang的import声明前的下划线是什么意思?

我在GitHub看到了来自sqlite3这个例子 :

 import ( "database/sql" "fmt" _ "github.com/mattn/go-sqlite3" "log" "os" ) 

似乎无法find导入语句前面的下划线。

简短的回答:

这是为了仅仅为了副作用而导入一个软件包。

从Go规格 :

要仅为其副作用(初始化)导入包,请使用空白标识符作为显式包名:

导入_“lib / math”

在sqlite3中

在go-sqlite3的情况下,下划线导入用于在init()函数中注册sqlite3驱动程序作为数据库驱动程序的副作用,而不导入任何其他函数:

 sql.Register("sqlite3", &SQLiteDriver{}) 

一旦以这种方式注册,sqlite3就可以像代码一样在代码中与标准库的sql接口一起使用:

 db, err := sql.Open("sqlite3", "./foo.db") 

http://golang.org/doc/effective_go.html#blank_unused

这是一个正在进行的工作,或import的副作用。 在这种情况下,我相信这是为了副作用,如文件中所述。

当其他答案完全描述它时,对于“向我展示代码”人员,这基本上意味着:创build包级variables并执行该包的init函数。

以及(如果有的话)该包已导入的包的包级variables和init函数的层次结构。

一个软件包可以做的唯一的副作用就是创build软件包级别的variables(public或private),并且在它的init函数内部。

注意 :在init函数之前运行一个函数是有一个技巧的。 我们可以通过使用该函数初始化它们来使用包级variables。

 func theVeryFirstFunction() int { log.Println("theVeryFirstFunction") return 6 } var ( Num = theVeryFirstFunction() ) func init() { log.Println("init", Num) }