Функция вернула nil-указатель, а проверка err != nil сработала
Валидатор написан так:
type ValidationError struct{ Field string }
func (e *ValidationError) Error() string { return "invalid " + e.Field }
func validate(r Request) error {
var verr *ValidationError
if r.Amount < 0 {
verr = &ValidationError{Field: "amount"}
}
return verr
}
// вызов
if err := validate(req); err != nil {
return fmt.Errorf("validate: %w", err)
}
Запрос корректный, verr остался nil, но ветка с ошибкой всё равно выполняется. Почему?
- `fmt.Errorf` сам создаёт непустую ошибку, поэтому условие ложно срабатывает
- Поведение зависит от того, вызывали ли `Error()` — до вызова интерфейс пустой
- Указатель на структуру нельзя сравнивать с nil, нужно использовать `errors.Is(err, nil)`
- Интерфейс `error` не равен nil: в нём лежит тип `*ValidationError` с nil-значением
