Ошибка, реализованная через интерфейс error

Показанный код уже работает: foo(6) возвращает ненулевой *MyError, и fmt.Println напечатает oops: i > 5. Описанная в тексте неисправность не воспроизводится этим фрагментом.

Короткий ответ

Что ответить на собеседовании

Показанный код уже работает: foo(6) возвращает ненулевой *MyError, и fmt.Println напечатает oops: i > 5. Описанная в тексте неисправность не воспроизводится этим фрагментом.

Подробный разбор

Ответ с пояснениями

Условие

В функции foo(i int) error формируется ошибка типа *MyError и возвращается как значение интерфейса error. При проверке результата в main() сообщение, возвращаемое методом Error(), не выводится, хотя переменная err не равна nil. Необходимо изменить программу так, чтобы вызов Error() корректно возвращал текст ошибки и он отображался в выводе.

package main

import "fmt"

type MyError struct {
 data string
}

func (e *MyError) Error() string {
 return e.data
}

func main() {
 err := foo(6)
 if err != nil {
  fmt.Println("oops:", err)
 } else {
  fmt.Println("ok")
 }
}

func foo(i int) error {
 var err error
 if i > 5 {
  err = &MyError{data: "i > 5"}
 }
 return err
}

Ответ

Показанный код уже работает: foo(6) возвращает ненулевой *MyError, и fmt.Println напечатает oops: i > 5. Описанная в тексте неисправность не воспроизводится этим фрагментом.

При i<=5 переменная err типа error остаётся nil, и main печатает ok. Проблема typed nil возникла бы при объявлении var err *MyError и возврате её как интерфейса без созданного объекта. Здесь такого нет. Менять правильный Error() или искусственно создавать ошибку не нужно; сначала сравните настоящий проблемный код с приведённым.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее