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