Создание ошибки без импортов внешних пакетов

Объявите собственный тип с методом 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 приведёт к панике.

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

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

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

Подробнее