Вернуть пользовательскую ошибку, не импортируя ни одного пакета
Реализуйте handle так, чтобы она возвращала не-nil ошибку с сообщением "custom error". Ограничение: нельзя импортировать ни один пакет — даже errors или fmt. Определите собственный тип ошибки.
func handle() error {
// your code here
}
Допишите реализацию.
error — это встроенный интерфейс с одним методом Error() string. Поэтому вы определяете структуру, даёте ей метод Error() string и возвращаете указатель на неё — импорт не нужен. func (e *customError) Error() string { return "custom error" }, затем return &customError{}. Любой тип, реализующий этот один метод, неявно удовлетворяет error.
- ✗Думать, что
errorживёт в пакете, а не является встроенным интерфейсом - ✗Считать
errorпсевдонимом дляstring, к которому можно привести - ✗Ожидать, что Go автогенерирует
Error()из поля структуры
- →Почему здесь для
Error()лучше указательный получатель, а не значимый? - →Как добавление полей в ваш тип ошибки позволит вызывающим разобрать её через
errors.As?
Решение
error в Go — это встроенный интерфейс:
type error interface {
Error() string
}
Любой тип, у которого есть метод Error() string, неявно удовлетворяет ему — импортировать ничего не нужно:
type customError struct{}
func (e *customError) Error() string {
return "custom error"
}
func handle() error {
return &customError{}
}
Возврат &customError{} даёт не-nil значение error. Поскольку удовлетворение интерфейсу в Go неявное, ни errors, ни fmt здесь не требуются.
Если в структуру добавить поля, ошибку можно обогатить контекстом и потом разбирать через errors.As:
type customError struct{ Code int }
func (e *customError) Error() string {
return "custom error"
}