Объявите собственный тип с методом Error() string. Встраивание nil-интерфейса error создаёт значение, но его метод небезопасно вызывать.
Создание ошибки без импортов внешних пакетов
Объявите собственный тип с методом Error() string. Встраивание nil-интерфейса error создаёт значение, но его метод небезопасно вызывать.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо реализовать функцию handle(), чтобы она возвращала значение типа error, при этом нельзя использовать import "errors" или любые другие внешние библиотеки.
package main
func main() {
println(handle())
}
func handle() error {
return &struct{ error }{}
}
Функция должна возвращать ошибку, используя только стандартные возможности языка без дополнительных импортов.
Ответ
Объявите собственный тип с методом Error() string. Встраивание nil-интерфейса error создаёт значение, но его метод небезопасно вызывать.
Полный вариант без импортов:
package main
type messageError string
func (e messageError) Error() string { return string(e) }
func handle() error {
return messageError("operation failed")
}
func main() {
err := handle()
if err != nil { println(err.Error()) }
}
Встроенный println(error) не является форматтером ошибок и не обязан вызывать Error. Поэтому для понятного сообщения здесь вызывается метод явно. Исходное &struct{ error }{} удовлетворяет интерфейсу за счёт встроенного поля, но поле равно nil и делегированный вызов Error приведёт к панике.