Есть два варианта: на уровне пакета создать переменные или создать структуры с методом Error().
В первом случае вы можете проверять ошибки на равенство переменной.
В случае со струтурами вы их сможете возвращать как ошибки и проверять по типу в коде.
Структуры и переменные-ошибки должны быть экспортируемыми для пакета (с заглавной буквы)
Пример переменной-ошибки:
var ErrAsVar = errors.New("Simple Custom Error 1")
Соответственно, вы ее можете импортировать в другом пакете и проверять в коде на равенство (err == ErrAsVar).
Но вы не можете поменять сообщение у этой ошибки. Если надо - то для этого нужны структуры.
// ZeroDivErr with different messages
type ZeroDivErr struct {
msg string
}
func (e *ZeroDivErr) Error() string {
return fmt.Sprintf("ZeroDivErr: can't divide by zero: %s", e.msg)
}
func NewZeroDivErr(msg string) *ZeroDivErr {
return &ZeroDivErr{msg}
}
Такую структуру можно проверять по типу с помощью reflect и у нее могут быть разные тексты:
if reflect.TypeOf(errTyped) == reflect.TypeOf(&ZeroDivErr{}) {...}
Пример в песочнице:
воскресенье, 25 марта 2018 г., 14:37:52 UTC+3 пользователь Andrey Velikoredchanin написал: