¿Qué significa un subrayado delante de una declaración de importación en Golang?


Vi este ejemplo a partir de sqlite3GitHub :

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

Y no parece encontrar lo que significa el subrayado delante de una declaración de importación.

 141
Author: Scott Stensland, 2014-01-19

3 answers

Respuesta corta:

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

De la Especificación Go :

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

Import _ "lib / math"

En sqlite3

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

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

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

db, err := sql.Open("sqlite3", "./foo.db")
 149
Author: Herman Schaaf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-18 15:05:16

Mientras que otras respuestas lo describieron completamente, para la gente de "Show me The Code", esto básicamente significa: crear variables a nivel de paquete y ejecutar la función init de ese paquete.

Y (en su caso) la jerarquía de variables a nivel de paquete & init funciones de paquetes que, este paquete ha importado.

El único efecto secundario que un paquete puede hacer, sin ser realmente llamado, es mediante la creación de variables a nivel de paquete (público o privado) y dentro de él es init función.

Nota: Hay un truco para ejecutar una función antes incluso de la función init. 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) }
 14
Author: Kaveh Shahbazian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-12 10:22:23

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

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

 11
Author: jgritty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-22 20:33:49