errors.Is и errors.As в Go: различия и сценарии использования пакет errors предназначен для работы с ошибками errors.Is: определяет, совпадает ли ошибка с заданной или встречается ли она внутри цепочки обёрнутых ошибок errors.As: проверяет возможность привести ошибку к определённому типу и получить доступ к дополнительным данным Is применяют для проверки конкретной ошибки, например sentinel error As используют, чтобы извлечь сведения из ошибки со специфичным типом Выбирайте Is, если имеет значение только сама сущность ошибки Используйте As, когда требуется получить подробности ошибки или воспользоваться её поведением обе функции работают с…
В чём разница между errors.Is и errors.As в Go и когда применять каждую функцию?
errors.Is и errors.As в Go: различия и сценарии использования пакет errors предназначен для работы с ошибками errors.Is: определяет, совпадает ли ошибка с заданной или встречается ли она внутри цепочки обёрнутых…
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
errors.Is и errors.As в Go: различия и сценарии использования
- пакет errors предназначен для работы с ошибками
- errors.Is: определяет, совпадает ли ошибка с заданной или встречается ли она внутри цепочки обёрнутых ошибок
- errors.As: проверяет возможность привести ошибку к определённому типу и получить доступ к дополнительным данным
- Is применяют для проверки конкретной ошибки, например sentinel error
- As используют, чтобы извлечь сведения из ошибки со специфичным типом
- Выбирайте Is, если имеет значение только сама сущность ошибки
- Используйте As, когда требуется получить подробности ошибки или воспользоваться её поведением
- обе функции работают с цепочкой ошибок (unwrap), что делает error handling более гибким
- практическое применение: Is позволяет фильтровать ошибки по значению, а As — работать с кастомными ошибками или интерфейсами
- главное различие: Is проверяет равенство, тогда как As проверяет и приводит тип
Итог: Is применяют для проверки совпадения ошибки, а As — чтобы получить ошибку требуемого типа и данные из неё.
Подробный ответ
Основной ответ
В Go функции errors.Is и errors.As предназначены для проверки ошибок, однако решают разные задачи. errors.Is определяет, соответствует ли ошибка конкретному значению — обычно константной ошибке или заранее объявленной переменной. errors.As, напротив, проверяет, можно ли привести ошибку к указанному типу или интерфейсу, чтобы получить доступ к данным, хранящимся внутри неё.
Ключевые моменты
- С помощью errors.Is удобно проверять, «равна» ли ошибка заданной ошибке либо обёртке, содержащей такое значение, благодаря поддержке интерфейса
Is(error) bool. Функция проходит по цепочке обёрток и сравнивает ошибки по значению, что особенно полезно при проверке Sentinel errors — заранее определённых ошибок. - errors.As применяют, когда необходимо выяснить, относится ли ошибка к конкретному типу, например к пользовательской структуре с дополнительными полями. Функция также обходит цепочку ошибок и при обнаружении подходящего типа записывает его через указатель.
- Например, когда достаточно проверить код ошибки, выбирают errors.Is. Если же требуется извлечь подробности и получить конкретный тип ошибки, используют errors.As.
Практический контекст
Начиная с Go 1.13 обе функции входят в стандартизированный подход и рекомендуются для обработки сложных цепочек, в которых ошибки обёрнуты через fmt.Errorf("... %w ..."). Так, HTTP-клиент может проверить ошибку соединения с помощью errors.Is(err, net.ErrClosed), а для получения статуса или других сведений применить errors.As и обратиться к типу *url.Error либо к пользовательскому типу с нужными полями.