Я видел этот пример из sqlite3
наGitHub
:
import (
"database/sql"
"fmt"
_ "github.com/mattn/go-sqlite3"
"log"
"os"
)
и не может найти то, что означает подчеркивание перед оператором импорта.
Я видел этот пример из sqlite3
наGitHub
:
import (
"database/sql"
"fmt"
_ "github.com/mattn/go-sqlite3"
"log"
"os"
)
и не может найти то, что означает подчеркивание перед оператором импорта.
Ответы:
Это для импорта пакета исключительно для его побочных эффектов.
Из спецификации Go :
Чтобы импортировать пакет исключительно для его побочных эффектов (инициализация), используйте пустой идентификатор в качестве явного имени пакета:
import _ "lib / math"
В случае go-sqlite3 импорт подчеркивания используется для побочного эффекта регистрации sqlite3
драйвера в качестве драйвера базы данных в init()
функции без импорта каких-либо других функций:
sql.Register("sqlite3", &SQLiteDriver{})
После такой регистрации sqlite3 можно использовать с sql
интерфейсом стандартной библиотеки в вашем коде, как в примере:
db, err := sql.Open("sqlite3", "./foo.db")
В то время как другие ответы описали это полностью, для людей «Покажи мне код» это в основном означает: создать переменные уровня пакета и выполнить init
функцию этого пакета.
И (если есть) иерархия переменных и init
функций уровня пакета, которые этот пакет импортировал.
Единственный побочный эффект, который может создать пакет, без фактического вызова, - это создание переменных уровня пакета (открытых или закрытых) и внутри его init
функции.
Примечание : есть хитрость, чтобы запустить функцию до четной init
функции. Для этого мы можем использовать переменные уровня пакета, инициализируя их с помощью этой функции.
func theVeryFirstFunction() int {
log.Println("theVeryFirstFunction")
return 6
}
var (
Num = theVeryFirstFunction()
)
func init() { log.Println("init", Num) }
https://golang.org/doc/effective_go.html#blank
Это либо работа в процессе, либо импортирована для побочных эффектов. В этом случае я считаю, что это для побочных эффектов, как описано в документе.