Senior
49
Форматтау кезінде %v мен %w арасындағы айырмашылық қандай? Және қателерді өңдеуді Do интерфейсінде қалай дұрыс қосуға болады?
Сұралған компаниялар
Cloud.ru
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
}
Таким образом, вызывающий код может обработать ошибку по своему усмотрению, а не терять её или игнорировать.