Sobes.tech
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
}

Таким образом, вызывающий код может обработать ошибку по своему усмотрению, а не терять её или игнорировать.