errors.Is(err, target)?errors.Is(err, target) рекурсивно разворачивает цепочку обёрнутых ошибок (через Unwrap()) и сравнивает каждую с target. Возвращает true, если находит совпадение.
Обычное err == target не сработает для обёрнутой ошибки: fmt.Errorf("wrap: %w", os.ErrNotExist) создаёт новое значение, и err == os.ErrNotExist будет false. errors.Is заглядывает внутрь цепочки.
err := fmt.Errorf("read file: %w", os.ErrNotExist)
if errors.Is(err, os.ErrNotExist) {
// true - ошибка где-то в цепочке
}
err == target - только точное совпадение указателя/значенияerrors.Is(err, target) - проверка по всей цепочке Unwrap()