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

Когда errors.As, а когда errors.Is

Вопрос

Нужно достать путь файла из ошибки *fs.PathError, лежащей где-то в цепочке. Что использовать?

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

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

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

Коротко

Правильный ответ: var pe fs.PathError; errors.As(err, &pe). errors.As ищет в цепочке первую ошибку, которую можно присвоить в целевую переменную, и заполняет её. errors.Is проверяет равенство конкретному значению, а не тип.

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

  1. var pe *fs.PathError; errors.As(err, &pe)правильный ответ
  2. errors.Is(err, &fs.PathError{}) с указателем
  3. pe := err.(*fs.PathError)
  4. errors.Unwrap(err).(*fs.PathError)

Разбор

errors.As ищет в цепочке первую ошибку, которую можно присвоить в целевую переменную, и заполняет её. errors.Is проверяет равенство конкретному значению, а не тип. Прямое приведение err.(*fs.PathError) смотрит только на верхнюю ошибку и упадёт, если она обёрнута. Один Unwrap снимает только один слой и тоже может не дойти.

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

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

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