Что означает символ подчеркивания перед выражением на импорт в Голанге?

Я видел этот пример из sqlite3 on GitHub:

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

и не может найти, что означает подчеркивание перед оператором импорта.

Ответ 1

Краткий ответ:

Это для импорта пакета исключительно для его побочных эффектов.

Из Спецификация Go:

Чтобы импортировать пакет исключительно для его побочных эффектов (инициализация), используйте пустой идентификатор как явное имя пакета:

import _ "lib/math"

В sqlite3

В случае go-sqlite3, импорт подчеркивания используется для побочного эффекта регистрации драйвера sqlite3 в качестве драйвера базы данных в init(), не импортируя никаких других функций:

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

Как только он зарегистрирован таким образом, sqlite3 можно использовать со стандартным интерфейсом библиотеки sql в вашем коде, как в примере:

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

Ответ 2

http://golang.org/doc/effective_go.html#blank_unused

Это либо незавершенное производство, либо импорт для побочных эффектов. В этом случае я считаю, что это касается побочных эффектов, как описано в документе.

Ответ 3

В то время как другие ответы описывали это полностью, для людей "Show me the Code" это в основном означает: создавать переменные уровня пакета и выполнять функцию init этого пакета.

И (если есть) иерархия переменных уровня пакета и init функций пакетов, которые этот пакет импортировал.

Единственный побочный эффект, который может сделать пакет без фактического вызова, - это создать переменные уровня пакета (публичные или частные) и внутри него init.

Примечание. Существует функция для запуска функции до функции init. Для этого мы можем использовать переменные уровня пакета, инициализируя их с помощью этой функции.

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

var (
    Num = theVeryFirstFunction()
)

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