В современном Go ошибки часто «обертываются» добавлением контекста через fmt.Errorf("...: %w", err). errors.Is и errors.As позволяют корректно работать с такой цепочкой ошибок, не теряя первопричину.
Как работает errors.Is:
-
Проверяет, содержит ли цепочка ошибок конкретную целевую ошибку.
-
Используется в основном для дозорных ошибок (io.EOF, context.Canceled и т. д.).
-
Семантика: "это (или завернутая версия) точная ошибка?"
Как работает errors.As:
-
Ищет в цепочке ошибку определенного типа.
-
Если найден, записывает его в переданную цель (указатель).
-
Семантика: "можно ли убрать ошибку такого типа из строки?"
Ключевое отличие:
-
errors.Is — ошибка проверки идентичности/эквивалентности.
-
errors.As — проверка типа и доступ к полям/методам, специфичным для типа.
Практическая схема использования:
-
Первый errors.Is для известных дозорных случаев.
-
Затем errors.As, если детали пользовательского типа (код, метаданные, контекст)
required.
-
Не сравнивайте завернутые ошибки через ==, потому что таким образом корректность
потерялся в оберточной цепочке.
Заключение:
errors.Is отвечает на вопрос «это та же ошибка?», а errors.As отвечает «это тот же тип ошибки?». Вместе они образуют корректную и надежную модель работы с переносом ошибок в Go.
Пример:
Итог
В современном Go ошибки часто «обертываются» добавлением контекста через fmt.Errorf("...: %w", err).