Вопрос проверяет разницу между Is и As
errors.Is проверяет, соответствует ли ошибка целевой (включая обёртки). errors.As пытается привести ошибку к указанному типу и извлечь дополнительные поля. Использовать Is для сравнения с известными ошибками, а As — для работы с кастомными типами ошибок.
Определения:
errors.Is(err, target) → bool: проверка цепочки ошибок на равенство target;
errors.As(err, &target) → bool: приведение цепочки ошибок к типу target.
var ErrNotFound = errors.New("not found")
if errors.Is(err, ErrNotFound) {
// это именно "не найдено"
}
var e *MyCustomError
if errors.As(err, &e) {
fmt.Println("код ошибки:", e.Code)
}Рекомендации:
Is для sentinel-ошибок;
As для типовых ошибок с полями (например, net.OpError).
Вывод: всегда оборачивайте ошибки через %w, чтобы Is/As корректно работали.