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 пакеты были включены в итоговое приложение.