Co oznacza podkreślenie przed instrukcją importu?

207

Widziałem ten przykład od sqlite3dniaGitHub :

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

i nie może znaleźć tego, co oznacza znak podkreślenia przed instrukcją importu.

Adrian
źródło

Odpowiedzi:

218

Krótka odpowiedź:

Służy do importowania pakietu wyłącznie ze względu na jego skutki uboczne.

Z specyfikacji Go :

Aby zaimportować pakiet wyłącznie ze względu na jego skutki uboczne (inicjowanie), użyj pustego identyfikatora jako jawnej nazwy pakietu:

import _ "lib / math"

W sqlite3

W przypadku go-sqlite3 import podkreślenia służy do efektu ubocznego rejestracji sqlite3sterownika jako sterownika bazy danych w init()funkcji, bez importowania innych funkcji:

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

Po zarejestrowaniu w ten sposób, sqlite3 może być używany ze standardowym sqlinterfejsem biblioteki w twoim kodzie, tak jak w przykładzie:

db, err := sql.Open("sqlite3", "./foo.db")
Herman Schaaf
źródło
34

Podczas gdy inne odpowiedzi opisywały go całkowicie, dla osób „Pokaż mi kod” oznacza to w zasadzie: utwórz zmienne na poziomie pakietu i uruchom initfunkcję tego pakietu.

I (jeśli w ogóle) hierarchię zmiennych na poziomie pakietu i initfunkcji pakietów, które ten pakiet zaimportował.

Jedynym efektem ubocznym, który pakiet może wywołać, bez faktycznego wywołania, jest utworzenie zmiennych na poziomie pakietu (publicznego lub prywatnego) i wewnątrz jego initfunkcji.

Uwaga : Istnieje sztuczka, aby uruchomić funkcję przed initfunkcją parzystą . Możemy do tego wykorzystać zmienne na poziomie pakietu, inicjując je za pomocą tej funkcji.

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

var (
    Num = theVeryFirstFunction()
)

func init() { log.Println("init", Num) }
Kaveh Shahbazian
źródło
17

https://golang.org/doc/effective_go.html#blank

Jest to albo praca w toku, albo importowana z powodu efektów ubocznych. W tym przypadku uważam, że to ze względu na skutki uboczne, jak opisano w dokumencie.

jgritty
źródło
Oto link do kotwicy importu efektów ubocznych na tej stronie. Wyjaśnia: „czasami warto zaimportować pakiet tylko ze względu na jego skutki uboczne, bez wyraźnego użycia”, oraz „Aby zaimportować pakiet tylko ze względu na jego skutki uboczne, zmień nazwę pakietu na pusty identyfikator”.
Luke Sheppard,