error — это интерфейс
«Файл не найден» долго был просто строкой, и сравнения по тексту начали сыпаться. Миша завёл в хранилище одну общую ошибку ErrNotFound, на которую можно ссылаться из любого слоя.
error — встроенный интерфейс с одним методом Error string; ошибки создают через errors.New и fmt.Errorf, а для сравнения — сентинелы-переменные.
Тип error
Что здесь показано
- Стек — локальные переменные функции.
i = 3— значение;p = ptr → 10— указатель на значение;b = "hello"— срез (заголовок: указатель + длина + ёмкость). - Куча — данные, на которые ссылаются переменные:
rodata— байты строки-литерала (в бинарнике),данные N Б— бэкинг-массив слайса,строка— динамическая строка. - Горутины — лёгкие потоки Go: статус (running/runnable/waiting…), функция, в которой каждая сейчас находится, размер стека (растёт по мере работы) и пометка «из main» — горутина запущена из твоего кода.
- GC — сборщик мусора: фаза (off/mark) и число завершённых циклов.
Это и есть весь тип error, предопределённый в языке. Любой тип с методом Error string — это ошибка. Поскольку error — интерфейс, к нему применима вся модель из прошлых уроков, включая ловушку typed nil.
Создание
err := errors.New("файл не найден")
err = fmt.Errorf("не удалось открыть %s: %v", path, err)
errors.New — для фиксированного текста, fmt.Errorf — с форматированием. Второй пример пока ущербный: %v теряет связь с исходной ошибкой — об этом следующий урок.
Сентинелы
var ErrNotFound = errors.New("файл не найден")
if errors.Is(err, ErrNotFound) {
// ...
}
Сентинел — переменная-ошибка уровня пакета, эталон «такой-то сбой». Сравнение через == работает, только когда ошибки не оборачиваются (урок покажет errors.Is). Сентинелы уместны для ошибок, на которые вызывающий должен реагировать по-разному.
Вы узнаете:
- как устроены собственные типы ошибок с полями
- почему сентинелы называют
ErrXxx, а неXxxError
error — интерфейс с одним методом. Создание — errors.New/fmt.Errorf; эталоны для сравнения — сентинелы. Дальше — оборачивание.
10 000 ₽ · 60 минут · онлайн