O que significa um sublinhado na frente de uma declaração de importação?

207

Eu vi esse exemplo a partir sqlite3deGitHub :

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

e parece que não consegue encontrar o significado do sublinhado na frente de uma declaração de importação.

Adrian
fonte

Respostas:

218

Resposta curta:

É para importar um pacote apenas por seus efeitos colaterais.

Na especificação Go :

Para importar um pacote apenas para seus efeitos colaterais (inicialização), use o identificador em branco como nome explícito do pacote:

importar _ "lib / math"

No sqlite3

No caso de go-sqlite3 , a importação de sublinhado é usada para o efeito colateral de registrar o sqlite3driver como um driver de banco de dados na init()função, sem importar outras funções:

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

Depois de registrado dessa maneira, o sqlite3 pode ser usado com a sqlinterface da biblioteca padrão em seu código, como no exemplo:

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

Enquanto outras respostas o descreveram completamente, para as pessoas "Mostre-me o Código", isso basicamente significa: criar variáveis ​​no nível do pacote e executar a initfunção desse pacote.

E (se houver) a hierarquia das variáveis ​​no nível do pacote e as initfunções dos pacotes que este pacote foi importado.

O único efeito colateral que um pacote pode causar, sem ser chamado de fato, é criando variáveis ​​no nível do pacote (públicas ou privadas) e dentro de sua initfunção.

Nota : Existe um truque para executar uma função antes mesmo da initfunção. Podemos usar variáveis ​​de nível de pacote para isso, inicializando-as usando essa função.

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

var (
    Num = theVeryFirstFunction()
)

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

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

É um trabalho em andamento ou importado para efeitos colaterais. Nesse caso, acredito que seja para os efeitos colaterais, conforme descrito no documento.

jgritty
fonte
Aqui está um link para a âncora Importar para efeitos colaterais nessa página. Ele explica: "às vezes é útil importar um pacote apenas para seus efeitos colaterais, sem nenhum uso explícito" e "Para importar o pacote apenas para seus efeitos colaterais, renomeie o pacote para o identificador em branco".
Luke Sheppard