Чем отличаются 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?
Чем отличаются 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позволяет объединить несколько ошибок в одну для удобной передачи или возврата- Вместе эти функции обеспечивают удобную и безопасную обработку сложных ошибок в коде на 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.