在 Go 导入中使用空白标识符进行初始化
Go 规范建议使用空白标识符作为显式包名称来单独导入包因为它的副作用。但是,此构造的目的可能并不明显。
一个现实用例是在不使用导出函数的情况下初始化数据库驱动程序。考虑以下示例:
package main import ( _ "github.com/jackc/pgx/v4/reflect" "github.com/jackc/pgx/v4" ) func main() { conn, err := pgx.Connect(ctx, "user=jack password=secret database=world") if err != nil { log.Fatal(err) } _ = conn }
在此代码片段中,_ "github.com/jackc/pgx/v4/reflect" 导入通过使用 init 函数初始化 PostgreSQL 驱动程序来设置数据库连接。由于我们不需要使用 Reflect 包的任何导出函数,因此我们使用空白标识符而不是包别名。
另一个示例是设置全局状态:
package main import ( _ "github.com/go-redis/redis/v9" "log" ) func init() { // Set up global Redis client client := redis.NewClient(redis.Options{ Addr: "localhost:6379", }) if err := client.Ping().Err(); err != nil { log.Fatalf("unable to connect to Redis: %v", err) } clientInfo, err := client.Info("Memory").Result() if err != nil { log.Fatalf("unable to get Redis info: %v", err) } log.Printf("Redis info: %s", clientInfo) } func main() { // Do stuff with the initialized global Redis client }
这里,_ "github.com/go-redis/redis/v9" 导入调用了 init 函数来建立全局 Redis 连接。通过使用空白标识符,我们避免使用包别名并允许编译器忽略它,同时仍然受益于初始化。
以上是何时以及为何在 Go 导入中使用空白标识符?的详细内容。更多信息请关注PHP中文网其他相关文章!