Вступить в клуб →
сложнаявопросОсновы Go: типы, ошибки, интерфейсы

Функция вернула 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-значением

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела