Как различаются errors.Is, errors.As и errors.Join в Go?

Чем отличаются errors.Is, errors.As и errors.Join Улучшения работы с ошибками, появившиеся в Go 1.13 и более поздних версиях errors.Is определяет, присутствует ли в ошибке заданная целевая ошибка: сравнивает её через…

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

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

Чем отличаются errors.Is, errors.As и errors.Join Улучшения работы с ошибками, появившиеся в Go 1.13 и более поздних версиях errors.Is определяет, присутствует ли в ошибке заданная целевая ошибка: сравнивает её через Is или проверяет цепочку обёрток errors.As пытается привести саму ошибку либо вложенную ошибку к указанному типу, чтобы получить дополнительную информацию errors.Join собирает несколько ошибок в одну, формируя цепочку или набор ошибок errors.Is применяют для проверки эквивалентности ошибок errors.As используют, чтобы получить доступ к ошибкам конкретного типа errors.Join позволяет объединить несколько ошибок в одну для удобной…

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

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

Чем отличаются errors.Is, errors.As и errors.Join

  • Улучшения работы с ошибками, появившиеся в Go 1.13 и более поздних версиях
  • errors.Is определяет, присутствует ли в ошибке заданная целевая ошибка: сравнивает её через Is или проверяет цепочку обёрток
  • errors.As пытается привести саму ошибку либо вложенную ошибку к указанному типу, чтобы получить дополнительную информацию
  • errors.Join собирает несколько ошибок в одну, формируя цепочку или набор ошибок
  • errors.Is применяют для проверки эквивалентности ошибок
  • errors.As используют, чтобы получить доступ к ошибкам конкретного типа
  • errors.Join позволяет объединить несколько ошибок в одну для удобной передачи или возврата
  • Вместе эти функции обеспечивают удобную и безопасную обработку сложных ошибок в коде на Go

Подробный ответ

Основной ответ

Начиная с Go 1.13 в язык добавили новые средства обработки ошибок: errors.Is, errors.As и errors.Join. Каждая из этих функций предназначена для своей задачи при обработке и проверке ошибок.

  • С помощью errors.Is можно проверить, совпадает ли ошибка или её цепочка с указанной целевой ошибкой — через сравнение интерфейса error либо Is метода.
  • Функция errors.As ищет в цепочке ошибку нужного типа и при нахождении сохраняет её в переданный указатель.
  • Функция errors.Join объединяет несколько ошибок и возвращает объект, содержащий их все. При этом с объединённым объектом можно работать как с одной ошибкой.

Ключевые моменты

errors.Is(err, target error) bool применяют, чтобы проверить равенство ошибки или её обёртывание с помощью fmt.Errorf("%w"). Такой шаблон позволяет определить, возникла ли конкретная ошибка внутри цепочки, например sql.ErrNoRows.

errors.As(err, target interface{}) bool проверяет, есть ли в цепочке ошибка, реализующая заданный тип, например пользовательский тип ошибки. Если приведение успешно, найденная ошибка записывается в target. Это особенно полезно, когда требуется работать с ошибкой определённого типа, а не только сравнивать её значение.

errors.Join(errs ...error) error создаёт ошибку, объединяющую несколько ошибок. При вызове errors.Is и errors.As такой объект ведёт себя как составная ошибка и выполняет проверку по всему набору. Это удобно, когда необходимо вернуть результаты сразу нескольких ошибок, например при одновременном взаимодействии с несколькими внешними сервисами.

Практический контекст

  • В прикладном коде errors.Is часто используют для простой проверки ошибок стандартной библиотеки или ошибок, обёрнутых с помощью %w.
  • errors.As применяют в логике, зависящей от точного типа ошибки, например при распознавании ошибок валидации или пользовательских ошибок API.
  • errors.Join часто используют для объединения ошибок параллельных операций или batch-обработки, например при одновременной отправке запросов к нескольким сервисам.

Этот набор функций заметно упрощает чистую и надёжную обработку ошибок по сравнению с подходами, применявшимися в ранних версиях Go.

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

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

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

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