Я видел этот пример из sqlite3
on GitHub
:
import (
"database/sql"
"fmt"
_ "github.com/mattn/go-sqlite3"
"log"
"os"
)
и не может найти, что означает подчеркивание перед оператором импорта.
Я видел этот пример из sqlite3
on 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")
http://golang.org/doc/effective_go.html#blank_unused
Это либо незавершенное производство, либо импорт для побочных эффектов. В этом случае я считаю, что это касается побочных эффектов, как описано в документе.
В то время как другие ответы описывали это полностью, для людей "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) }