Как известно, тип error - это просто интерфейс, под которым может скрываться любой тип, который этот интерфейс реализует.
И для проверки и распаковки ошибки в переменную нужного типа применяется errors.As, но этот метод неудобен: надо сначала создавать переменную, а потом туда загонять значение
var appErr AppError
if errors.As(err, &appErr) {
fmt.Println("Got an AppError:", appErr)
}
Особенно это напрягает если есть цепочка if, else if ..., перед этой цепочкой надо создать все переменные.
Ну так вот, приняли proposal, который позволяет это сделать попроще. "type-safe, faster, and easier"
if appErr, ok := errors.AsType[AppError](err); ok {
fmt.Println("Got an AppError:", appErr)
}
Наличие дженериков в Go снова помогло улучшить стандартную библиотеку.
🫥 Cross Join - канал о разработке
⠀