Wat betekent een onderstrepingsteken voor een importstatement?

Ik zag dit voorbeeld van sqlite3op GitHub:

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

en kan niet vinden wat het onderstrepingsteken voor een importstatement betekent.


Antwoord 1, autoriteit 100%

Kort antwoord:

Het is alleen bedoeld om een ​​pakket te importeren vanwege de bijwerkingen.

Van de Go-specificatie:

Als u een pakket alleen vanwege de bijwerkingen (initialisatie) wilt importeren, gebruikt u de blanco identifier als expliciete pakketnaam:

import _ “lib/math”

In sqlite3

In het geval van go-sqlite3, het onderstrepingsteken import wordt gebruikt als neveneffect van het registreren van het sqlite3-stuurprogramma als een databasestuurprogramma in de functie init(), zonder andere functies te importeren:

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

Zodra het op deze manier is geregistreerd, kan sqlite3 worden gebruikt met de sql-interface van de standaardbibliotheek in uw code, zoals in het voorbeeld:

db, err := sql.Open("sqlite3", "./foo.db")

Antwoord 2, autoriteit 17%

Terwijl andere antwoorden het volledig beschreven, betekent dit voor “Laat me de code”-mensen in feite: variabelen op pakketniveau maken en de functie initvan dat pakket uitvoeren.

En (indien aanwezig) de hiërarchie van variabelen op pakketniveau & initfuncties van pakketten die dit pakket heeft geïmporteerd.

Het enige neveneffect dat een pakket kan hebben, zonder dat het daadwerkelijk wordt aangeroepen, is door variabelen op pakketniveau te creëren (openbaar of privé) en binnen de functie init.

Opmerking: Er is een truc om een ​​functie uit te voeren voordat de functie initzelfs maar uit is. We kunnen hiervoor variabelen op pakketniveau gebruiken door ze te initialiseren met die functie.

func theVeryFirstFunction() int {
    log.Println("theVeryFirstFunction")
    return 6
}
var (
    Num = theVeryFirstFunction()
)
func init() { log.Println("init", Num) }

Antwoord 3, autoriteit 7%

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

Het is een werk in uitvoering, of geïmporteerd voor bijwerkingen. In dit geval denk ik dat het voor de bijwerkingen is, zoals beschreven in het document.


Antwoord 4

Stel dat je een Dierenpakket hebt. En je hoofdbestand wil dat Animal-pakket gebruiken om een ​​methode met de naam Speak aan te roepen, maar er zijn veel verschillende soorten dieren en elk dier implementeerde zijn eigen gemeenschappelijke Talk-methode. Dus laten we zeggen dat je een methode Speak wilt aanroepen die is geïmplementeerd in het Animal’s-pakket, die intern de Talk-methode aanroept die is geïmplementeerd in elk van het animal’s pakket. Dus in dit geval wil je gewoon een import _ “dog” doen die de init-methode zal aanroepen die is gedefinieerd in het dog-pakket en die daadwerkelijk een Talk-methode registreert bij het Animal-pakket dat het ook importeert.

Other episodes