¿Qué significa un guión bajo frente a una declaración de importación?

207

Vi este ejemplo desde sqlite3elGitHub :

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

y parece que no puede encontrar lo que significa el guión bajo delante de una declaración de importación.

Adrian
fuente

Respuestas:

218

Respuesta corta:

Es para importar un paquete únicamente por sus efectos secundarios.

De la especificación de Go :

Para importar un paquete únicamente por sus efectos secundarios (inicialización), use el identificador en blanco como nombre explícito del paquete:

importar _ "lib / math"

En sqlite3

En el caso de go-sqlite3 , la importación de subrayado se utiliza para el efecto secundario de registrar el sqlite3controlador como un controlador de base de datos en la init()función, sin importar ninguna otra función:

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

Una vez que se registra de esta manera, sqlite3 se puede usar con la sqlinterfaz de la biblioteca estándar en su código como en el ejemplo:

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

Mientras que otras respuestas lo describen completamente, para la gente de "Muéstrame el código", esto básicamente significa: crear variables de nivel de paquete y ejecutar el init función de ese paquete.

Y (si corresponde) la jerarquía de las variables y initfunciones a nivel de paquete de los paquetes que este paquete ha importado.

El único efecto secundario que puede producir un paquete, sin ser llamado realmente, es creando variables a nivel de paquete (público o privado) y dentro de su initfunción.

Nota : Hay un truco para ejecutar una función incluso antes de la initfunción. Podemos usar variables de nivel de paquete para esto inicializándolas usando esa función.

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

var (
    Num = theVeryFirstFunction()
)

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

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

Es un trabajo en progreso o importado para efectos secundarios. En este caso, creo que es por los efectos secundarios, como se describe en el documento.

jgritty
fuente
Aquí hay un enlace a Importar para el ancla de efectos secundarios en esa página. Explica: "a veces es útil importar un paquete solo por sus efectos secundarios, sin ningún uso explícito" y "Para importar el paquete solo por sus efectos secundarios, cambie el nombre del paquete al identificador en blanco".
Luke Sheppard