Cosa significa un carattere di sottolineatura davanti a una dichiarazione di importazione?


207

Ho visto questo esempio da sqlite3sopraGitHub :

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

e non riesco a trovare il significato del carattere di sottolineatura davanti a una dichiarazione di importazione.

Risposte:


218

Risposta breve:

Serve per importare un pacchetto esclusivamente per i suoi effetti collaterali.

Dalla specifica Go :

Per importare un pacchetto esclusivamente per i suoi effetti collaterali (inizializzazione), utilizzare l'identificatore vuoto come nome di pacchetto esplicito:

import _ "lib / math"

In sqlite3

Nel caso di go-sqlite3 , l'importazione di sottolineatura viene utilizzata per l'effetto collaterale della registrazione del sqlite3driver come driver di database nella init()funzione, senza importare altre funzioni:

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

Una volta registrato in questo modo, sqlite3 può essere utilizzato con l' sqlinterfaccia della libreria standard nel codice come nell'esempio:

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

34

Mentre altre risposte lo descrivevano completamente, per le persone "Mostrami il codice", ciò significa sostanzialmente: creare variabili a livello di pacchetto ed eseguire il init funzione di quel pacchetto.

E (se presente) la gerarchia di variabili a livello initdi pacchetto e funzioni di pacchetti che questo pacchetto ha importato.

L'unico effetto collaterale che un pacchetto può fare, senza essere effettivamente chiamato, è la creazione di variabili a livello di pacchetto (pubblico o privato) e all'interno della sua initfunzione.

Nota : esiste un trucco per eseguire una funzione anche prima della initfunzione. Per questo possiamo usare variabili a livello di pacchetto inizializzandole usando quella funzione.

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

var (
    Num = theVeryFirstFunction()
)

func init() { log.Println("init", Num) }

17

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

È un lavoro in corso o importato per gli effetti collaterali. In questo caso, credo che sia per gli effetti collaterali, come descritto nel documento.


Ecco un link all'ancoraggio Import for side effect in quella pagina. Spiega "a volte è utile importare un pacchetto solo per i suoi effetti collaterali, senza alcun uso esplicito" e "Per importare il pacchetto solo per i suoi effetti collaterali, rinominare il pacchetto nell'identificatore vuoto".
Luke Sheppard,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.