Выбор ответа Junior Ошибки, defer, panic и recover спрашивают часто обновлено

errors.Is и обёрнутая ошибка

Вопрос

Что выведет код?

var ErrNotFound = errors.New("not found")

err := fmt.Errorf("get user 7: %w", ErrNotFound)
fmt.Println(err == ErrNotFound, errors.Is(err, ErrNotFound))

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: false true. fmt.Errorf с %w создаёт новую ошибку, которая оборачивает ErrNotFound.

Варианты ответа

  1. true true
  2. false false
  3. false trueправильный ответ
  4. true false

Разбор

fmt.Errorf с %w создаёт новую ошибку, которая оборачивает ErrNotFound. Прямое сравнение == сравнивает с внешней ошибкой: false. errors.Is идёт по цепочке Unwrap и находит sentinel: true. Поэтому обёрнутые ошибки проверяют только через errors.Is.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме