Назад к вопросам
Senior
5
Чем отличается %v от %w в форматировании? И как правильнее добавить обработку ошибок в интерфейс Do?
Компании, где спрашивали
Cloud.ru
Ответ от нейросети
sobes.tech AI
В Go при форматировании ошибок с помощью пакета fmt:
%v— выводит ошибку как есть, то есть просто сообщение ошибки.%w— используется для оборачивания ошибки, чтобы сохранить цепочку ошибок (wrapping), позволяя использоватьerrors.Isиerrors.Asдля проверки.
Пример:
if err != nil {
return fmt.Errorf("ошибка при чтении файла: %w", err) // оборачиваем ошибку
}
Здесь %w позволяет вложить исходную ошибку внутрь новой, сохраняя информацию.
Что касается интерфейса Do, если он возвращает ошибку, правильнее всего делать обработку ошибок через возвращаемое значение, а не через панику или логирование внутри метода.
Например:
type Doer interface {
Do() error
}
func Process(d Doer) error {
if err := d.Do(); err != nil {
return fmt.Errorf("ошибка выполнения Do: %w", err)
}
return nil
}
Таким образом, вызывающий код может обработать ошибку по своему усмотрению, а не терять её или игнорировать.