Цей приклад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
Це або незавершене виробництво, або імпортне для побічних ефектів. У цьому випадку я вважаю, що це стосується побічних ефектів, як описано в документі.