Was bedeutet ein Unterstrich vor einer Importanweisung?

Antworten:

218

Kurze Antwort:

Es dient zum Importieren eines Pakets ausschließlich wegen seiner Nebenwirkungen.

Von Anfang an Spezifikation :

Verwenden Sie die leere Kennung als expliziten Paketnamen, um ein Paket ausschließlich wegen seiner Nebenwirkungen (Initialisierung) zu importieren:

importiere _ "lib / math"

In sqlite3

Im Fall von go-sqlite3 wird der Unterstrichimport für den Nebeneffekt verwendet, den sqlite3Treiber als Datenbanktreiber in der init()Funktion zu registrieren , ohne andere Funktionen zu importieren:

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

Sobald es auf diese Weise registriert wurde, kann sqlite3 mit der sqlSchnittstelle der Standardbibliothek in Ihrem Code verwendet werden, wie im folgenden Beispiel:

db, err := sql.Open("sqlite3", "./foo.db")
Herman Schaaf
quelle
34

Während andere Antworten es vollständig beschrieben haben, bedeutet dies für "Show me The Code" -Personen im Grunde: Variablen auf Paketebene erstellen und die initFunktion dieses Pakets ausführen .

Und (falls vorhanden) die Hierarchie der Variablen und initFunktionen auf Paketebene von Paketen, die dieses Paket importiert hat.

Der einzige Nebeneffekt, den ein Paket erzielen kann, ohne tatsächlich aufgerufen zu werden, besteht darin, Variablen auf Paketebene (öffentlich oder privat) und innerhalb seiner initFunktion zu erstellen .

Hinweis : Es gibt einen Trick, eine Funktion vor einer geraden initFunktion auszuführen . Wir können hierfür Variablen auf Paketebene verwenden, indem wir sie mit dieser Funktion initialisieren.

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

var (
    Num = theVeryFirstFunction()
)

func init() { log.Println("init", Num) }
Kaveh Shahbazian
quelle
17

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

Es ist entweder in Arbeit oder wird wegen Nebenwirkungen importiert. In diesem Fall glaube ich, dass es für die Nebenwirkungen ist, wie im Dokument beschrieben.

jgritty
quelle
Hier ist ein Link zum Anker " Importieren für Nebenwirkungen" auf dieser Seite. Es wird erklärt, "manchmal ist es nützlich, ein Paket nur wegen seiner Nebenwirkungen ohne explizite Verwendung zu importieren" und "Um das Paket nur wegen seiner Nebenwirkungen zu importieren, benennen Sie das Paket in die leere Kennung um".
Luke Sheppard