在Go语言中,如果你在导入包时前面加上了下划线 _
,如 _ "github.com/my/package"
,那么这被称为“blank import”。这种导入方式的意思是:我想导入这个包,执行它的初始化函数(包括全局变量的初始化和init
函数的执行),但我并不打算在代码中直接使用这个包的任何公开的标识符(例如函数、类型、变量等)。
在Go语言中,如果你导入了一个包,却没有在代码中使用它,编译器会报错,因为Go语言鼓励编写精简、无冗余的代码。然而,有些包在被导入时会执行一些有用的初始化工作,尽管我们并不需要直接使用它的任何函数或变量。在这种情况下,我们可以使用 blank import 来导入这个包。
对于这种导入方式,对应的包初始化顺序并没有特别之处。Go编译器会正常地执行该包的初始化过程,包括导入依赖的包、初始化全局变量、执行init
函数等步骤。
举个例子,database/sql
包的驱动通常就是通过这种方式来注册的。一个数据库驱动包可能没有公开的函数或变量需要使用,它的所有工作可能都在初始化函数中完成,包括将自己注册到 database/sql
包。在这种情况下,我们就会使用 blank import 来导入这个驱动包:
import _ "github.com/go-sql-driver/mysql"
上面的代码将导入 MySQL 驱动,驱动会在初始化过程中注册自己,使得我们可以在 database/sql
包中使用它。