import (
"database/sql"
"fmt"
_ "github.com/mattn/go-sqlite3"
"log"
"os"
)
并且似乎无法找到import语句前面的下划线是什么意思。
import (
"database/sql"
"fmt"
_ "github.com/mattn/go-sqlite3"
"log"
"os"
)
并且似乎无法找到import语句前面的下划线是什么意思。
Answers:
它仅出于副作用导入软件包。
从执行规范:
要仅出于副作用(初始化)导入软件包,请使用空白标识符作为显式软件包名称:
导入_“ lib / math”
对于go-sqlite3,下划线导入用于将sqlite3
驱动程序注册为该init()
函数中的数据库驱动程序的副作用,而无需导入任何其他功能:
sql.Register("sqlite3", &SQLiteDriver{})
以这种方式注册后,可将sqlite3与sql
代码中的标准库接口一起使用,如示例所示:
db, err := sql.Open("sqlite3", "./foo.db")
对于“向我展示代码”人员,其他答案已完全描述了它,这基本上意味着:创建程序包级变量并执行该init
程序包的功能。
以及(如果有)init
此包已导入的包级变量和包的功能的层次结构。
一个包可以在没有被实际调用的情况下产生的唯一副作用是,在包的init
函数内部创建包级别的变量(公共或私有)。
注意:在偶数init
函数之前先运行一个函数是有技巧的。我们可以通过使用该函数初始化它们来使用包级变量。
func theVeryFirstFunction() int {
log.Println("theVeryFirstFunction")
return 6
}
var (
Num = theVeryFirstFunction()
)
func init() { log.Println("init", Num) }
https://golang.org/doc/effective_go.html#blank
它要么正在进行中,要么因副作用而导入。在这种情况下,我认为这是针对副作用的,如文档中所述。