web-dev-qa-db-fra.com

Que signifie un trait de soulignement devant une déclaration d'importation?

J'ai vu cet exemple de sqlite3 sur GitHub :

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

et ne semble pas pouvoir trouver ce que le trait de soulignement devant une déclaration d'importation signifie.

172
Adrian

Réponse courte:

C'est pour importer un paquet uniquement pour ses effets secondaires.

De la spécification Go :

Pour importer un package uniquement pour ses effets secondaires (initialisation), utilisez l'identificateur vide en tant que nom de package explicite:

importer _ "lib/math"

En sqlite3

Dans le cas de go-sqlite , l’importation de soulignement est utilisée pour l’effet secondaire de l’enregistrement du pilote sqlite3 En tant que pilote de base de données dans la fonction init(), sans importer d'autres fonctions:

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

Une fois enregistré de cette manière, sqlite3 peut être utilisé avec l'interface sql de la bibliothèque standard dans votre code, comme dans l'exemple suivant:

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

Alors que d'autres réponses le décrivaient complètement, pour les personnes "Montrez-moi le code", cela signifie essentiellement: créez des variables au niveau du package et exécutez la fonction init de ce package.

Et (le cas échéant) la hiérarchie des variables au niveau du package & init fonctions des packages que ce package a importés.

Le seul effet secondaire qu'un paquet peut avoir, sans être appelé, consiste à créer des variables au niveau du paquet (publiques ou privées) et à l'intérieur de sa fonction init.

Note: Il y a une astuce pour exécuter une fonction avant même la fonction init. Pour cela, nous pouvons utiliser des variables de niveau paquet en les initialisant avec cette fonction.

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

var (
    Num = theVeryFirstFunction()
)

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

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

C'est soit un travail en cours, soit importé pour des effets secondaires. Dans ce cas, je crois que c’est pour les effets secondaires, tels que décrits dans la doc.

15
jgritty