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

207

J'ai vu cet exemple de sqlite3surGitHub :

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

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

Adrian
la source

Réponses:

218

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'identifiant vide comme nom de package explicite:

import _ "lib / math"

Dans sqlite3

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

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

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

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

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

Et (le cas échéant) la hiérarchie des variables et initfonctions au niveau des packages des packages que ce package a importés.

Le seul effet secondaire qu'un package peut faire, sans être réellement appelé, est de créer des variables au niveau du package (publiques ou privées) et à l'intérieur de sa initfonction.

Remarque : Il existe une astuce pour exécuter une fonction avant même la initfonction. Nous pouvons utiliser des variables de niveau package pour cela en les initialisant à l'aide de cette fonction.

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

var (
    Num = theVeryFirstFunction()
)

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

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 pense que c'est pour les effets secondaires, comme décrit dans la doc.

jgritty
la source
Voici un lien vers l' ancre d' importation d'effets secondaires sur cette page. Il explique, "il est parfois utile d'importer un package uniquement pour ses effets secondaires, sans aucune utilisation explicite", et "Pour importer le package uniquement pour ses effets secondaires, renommez le package en identifiant vide".
Luke Sheppard