Зачем при импорте пакета Go используют подчёркивание?

Blank import запускает инициализацию без доступного имени пакета. Регистрация драйверов и форматов, побочные эффекты и отличие от обычного импорта.

Короткий ответ

Что ответить на собеседовании

Запись import _ "package/path" импортирует пакет ради инициализации, не вводя имя для обращения к его экспортируемым объектам. Выполняется инициализация переменных и функций init пакета и его зависимостей. Типичный случай — регистрация драйвера или декодера. Это явный побочный эффект, а не универсальный способ скрывать ненужные зависимости.

Подробный разбор

Ответ с пояснениями

_ в объявлении импорта — 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 не является ленивой загрузкой или динамическим плагином. Побочные эффекты могут менять глобальные реестры, регистрировать обработчики и влиять на запуск. Поэтому оставляйте его только при понятной необходимости и комментируйте неочевидную регистрацию. Если зависимость вообще не нужна, её удаляют, а не маскируют подчёркиванием.

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку