Что означает подчеркивание перед оператором импорта?

Ответы:

218

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

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

Из спецификации Go :

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

import _ "lib / math"

В sqlite3

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

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

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

db, err := sql.Open("sqlite3", "./foo.db")
Герман Шааф
источник
34

В то время как другие ответы описали это полностью, для людей «Покажи мне код» это в основном означает: создать переменные уровня пакета и выполнить init функцию этого пакета.

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

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

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

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

var (
    Num = theVeryFirstFunction()
)

func init() { log.Println("init", Num) }
Каве Шахбазян
источник
17

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

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

jgritty
источник
Вот ссылка на ссылку « Импорт для побочного эффекта» на этой странице. Он объясняет, «иногда полезно импортировать пакет только для его побочных эффектов, без какого-либо явного использования», и «Чтобы импортировать пакет только для его побочных эффектов, переименуйте пакет в пустой идентификатор».
Люк Шеппард