Контекст: В сервисах places.go использовался fmt.Errorf("not your place"), что не позволяло проверить тип ошибки через errors.Is().
Суть: Sentinel errors — это именованные переменные-ошибки на уровне пакета, которые позволяют вызывающему коду проверять причину ошибки без парсинга строки.
var (
ErrNotYourPlace = errors.New("not your place")
ErrPlaceNotFound = errors.New("place not found")
)
// Использование:
if !isModerator && place.OwnerID != input.OwnerID {
return nil, fmt.Errorf("%w: user %s tried to update place %s",
ErrNotYourPlace, input.OwnerID, input.ID)
}
// Проверка:
if errors.Is(err, ErrNotYourPlace) {
// вернуть 403
}
Плюсы:
errors.Is() работает стабильно%wСвязанные заметки: [[backend-auth-security]], [[backend-validation]]
Источник: Code review: P0 fix в services/places.go
#golang #backend #best-practice #error-handling