Що означає підкреслення перед заявою про імпорт?


Відповіді:


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

Це або незавершене виробництво, або імпортне для побічних ефектів. У цьому випадку я вважаю, що це стосується побічних ефектів, як описано в документі.


Ось посилання на імпорт якоря для побічних ефектів на цій сторінці. Це пояснює: "іноді корисно імпортувати пакет лише для його побічних ефектів без явного використання", і "Щоб імпортувати пакунок лише за його побічними ефектами, перейменуйте пакет на порожній ідентифікатор".
Люк Шеппард
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.