ПрограммированиеGo разработчик

Что такое blank identifier в Go и где его правильно использовать? Есть ли «подводные камни» при его применении?

Проходите собеседования с ИИ помощником Hintsage

Ответ

Blank identifier (_) — специальный идентификатор в Go, который служит для игнорирования значений. Он используется, когда возвращаемое функцией значение не нужно, при импорте пакетов только ради вызова их init или при реализации интерфейсов.

Примеры:

// Игнорируем возвращаемое значение ошибки data, _ := ioutil.ReadFile("file.txt") // Импорт пакета только ради побочных эффектов import _ "net/http/pprof"

Кроме того, blank identifier помогает при реализации интерфейса, не используя явно все методы:

var _ io.Reader = (*MyReader)(nil) // компиляция провалится, если тип не реализует интерфейс

Вопрос с подвохом

Можно ли использовать blank identifier для постоянного подавления ошибок? Это безопасная практика?

Ответ: Нет. Хотя blank identifier позволяет игнорировать ошибку, это не безопасная практика — подавление ошибок часто приводит к фатальным багам или некорректной работе программы. Всегда следует осознанно обрабатывать ошибки и только в понятных местах (например, явно незначимых для логики) использовать blank identifier для их подавления.

Примеры реальных ошибок из-за незнания тонкостей темы


История

В приложении для работы с файлами разработчик везде использовал конструкцию _, _ = file.Write(...), игнорируя ошибки на запись. В результате при переполнении диска или сбое записи программа продолжала работать «как будто всё хорошо», приводя к потере данных.


История

В одном проекте по ведению аудита аудитор считал, что если функция возвращает ошибку, её всегда нужно подавлять (_). Из-за этого на тестировании не были замечены ошибки при записи лога действий — важные данные терялись, а причина не была понятна.


История

Студент, изучая Go, использовал blank identifier при импорте нескольких сторонних пакетов, хотя это было вовсе не нужно. В результате размер бинарного файла возрос почти в 2 раза, поскольку все side effect пакеты были включены в итоговое приложение.