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

新手上路,请多包涵

在 go-sqlite3 的 这段代码 中:

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

import 语句中的下划线是什么意思?

原文由 Adrian 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 541
2 个回答

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

来自 Go 规范

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

>  import _ "lib/math"
>
> ```

### 在sqlite3中

在 [go-sqlite3](https://github.com/mattn/go-sqlite3/blob/master/sqlite3.go) 的情况下,下划线导入用于将 `sqlite3` 驱动程序注册为 `init()` 函数中的数据库驱动程序的副作用,而不导入任何其他函数:

sql.Register(“sqlite3”, &SQLiteDriver{})


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

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

”`

原文由 Herman Schaaf 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

和(如果有的话)包级变量的层次结构 & init 这个包已经导入的包的函数。

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

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

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

var (
    Num = theVeryFirstFunction()
)

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

原文由 Kaveh Shahbazian 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题