在Golang中,import语句前面的下划线是什么意思?

Adr*_*ian 182 import go

sqlite3上面GitHub看过这个例子:

import (
        "database/sql"
        "fmt"
        _ "github.com/mattn/go-sqlite3"
        "log"
        "os"
)
Run Code Online (Sandbox Code Playgroud)

并且似乎无法找到import语句前面的下划线意味着什么.

Her*_*aaf 192

简短回答:

它仅用于导入包装副作用.

来自Go规范:

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

import _"lib/math"

在sqlite3中

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

sql.Register("sqlite3", &SQLiteDriver{})
Run Code Online (Sandbox Code Playgroud)

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

db, err := sql.Open("sqlite3", "./foo.db")
Run Code Online (Sandbox Code Playgroud)


Kav*_*ian 25

虽然其他答案完全描述了它,但对于"Show me The Code"人来说,这基本上意味着:创建包级变量并执行该init包的功能.

并且(如果有的话)包导出的包的级别变量和init函数的层次结构.

一个包可以在没有实际调用的情况下产生的唯一副作用是创建包级变量(公共或私有)及其内部init函数.

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

func theVeryFirstFunction() int {
    log.Println("theVeryFirstFunction")
    return 6
}

var (
    Num = theVeryFirstFunction()
)

func init() { log.Println("init", Num) }
Run Code Online (Sandbox Code Playgroud)


jgr*_*tty 16

https://golang.org/doc/effective_go.html#blank

它既可以是正在进行的工作,也可以是为副作用导入的.在这种情况下,我认为这是副作用,如文档中所述.


Ank*_*ari 6

假设您有一个 Animal 包。您的主文件想要使用该 Animal 包来调用名为 Speak 的方法,但是有许多不同类型的动物,并且每种动物都实现了自己的通用 Talk 方法。假设您想要调用 Animal 包中实现的 Speak 方法,该方法在内部调用每个动物包中实现的 Talk 方法。因此,在这种情况下,您只想执行 import _ "dog" ,它实际上会调用 Dog 包中定义的 init 方法,该方法实际上向它也导入的 Animal 包注册了一个 Talk 方法。