为了账号安全,请及时绑定邮箱和手机立即绑定

导入语句前面的下划线是什么意思?

导入语句前面的下划线是什么意思?

Go
倚天杖 2021-07-13 13:09:02
我看到从这个例子sqlite3上GitHub:import (        "database/sql"        "fmt"        _ "github.com/mattn/go-sqlite3"        "log"        "os")并且似乎无法找到 import 语句前面的下划线是什么意思。
查看完整描述

3 回答

?
慕森卡

TA贡献1806条经验 获得超8个赞

简短的回答:

它仅用于导入包的副作用。

从Go 规范:

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

导入_“lib/数学”

在 sqlite3 中

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

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

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

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


查看完整回答
反对 回复 2021-07-19
?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

虽然其他答案完全描述了它,但对于“向我展示代码”的人来说,这基本上意味着:创建包级变量并执行该init包的功能。


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


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


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


func theVeryFirstFunction() int {

    log.Println("theVeryFirstFunction")

    return 6

}


var (

    Num = theVeryFirstFunction()

)


func init() { log.Println("init", Num) }


查看完整回答
反对 回复 2021-07-19
  • 3 回答
  • 0 关注
  • 227 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信