在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中文網其他相關文章!