Рекомендуется использовать errors.Is и errors.As. Обычное сравнение err == ErrNotFound не работает с обёрнутыми ошибками (fmt.Errorf("%w", err)). errors.Is проходит по цепочке Unwrap и находит целевую ошибку.
if errors.Is(err, ErrNotFound) {
// обработать "не найдено"
}
var pathErr *fs.PathError
if errors.As(err, &pathErr) {
fmt.Println(pathErr.Path) // извлечь данные из ошибки
}
Текст ошибки может измениться при локализации или рефакторинге. Сравнение по типу и sentinel-значению (Is/As) стабильно. Обёртывайте свои ошибки через %w, чтобы цепочка сохранялась.