Back to questions
Senior
6
Чем отличается %v от %w в форматировании? И как правильнее добавить обработку ошибок в интерфейс Do?
Companies where asked
Cloud.ru
Answer from AI
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
}
Таким образом, вызывающий код может обработать ошибку по своему усмотрению, а не терять её или игнорировать.