Запись import _ "package/path" импортирует пакет ради инициализации, не вводя имя для обращения к его экспортируемым объектам. Выполняется инициализация переменных и функций init пакета и его зависимостей. Типичный случай — регистрация драйвера или декодера. Это явный побочный эффект, а не универсальный способ скрывать ненужные зависимости.
Зачем при импорте пакета Go используют подчёркивание?
Blank import запускает инициализацию без доступного имени пакета. Регистрация драйверов и форматов, побочные эффекты и отличие от обычного импорта.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
_ в объявлении импорта — blank identifier. Он показывает, что программе нужны побочные эффекты инициализации пакета, но она не будет напрямую обращаться к его именам.
Например, декодер JPEG регистрируется для использования через общий пакет image:
import (
"image"
_ "image/jpeg"
)
// В функции: img, format, err := image.Decode(reader)
Пакет image/jpeg инициализируется, но имя jpeg из такого импорта недоступно. Для прямого вызова jpeg.Decode нужен обычный импорт. Этот приём описан в Effective Go.
Аналогичный шаблон встречается у драйверов database/sql: импорт регистрирует реализацию, а приложение работает через общий интерфейс. Инициализация включает не только вызовы init, но и вычисление переменных уровня пакета; зависимости инициализируются прежде использующего их пакета. В пределах программы один пакет не инициализируется заново из-за каждого места импорта.
Blank import не является ленивой загрузкой или динамическим плагином. Побочные эффекты могут менять глобальные реестры, регистрировать обработчики и влиять на запуск. Поэтому оставляйте его только при понятной необходимости и комментируйте неочевидную регистрацию. Если зависимость вообще не нужна, её удаляют, а не маскируют подчёркиванием.