• Пакет
errors — самый быстрый способПодходит для простых статичных ошибок. Такую переменную удобно объявить один раз и сравнивать через
errors.Is.var ErrNotFound = errors.New("запись не найдена")•
fmt.Errorf() — когда нужен контекстПозволяет подставить в текст детали. А глагол
%w ещё и «оборачивает» исходную ошибку, сохраняя цепочку для errors.Is / errors.Unwrap.return fmt.Errorf("не удалось загрузить юзера %d: %w", id, ErrNotFound)• Кастомный тип через
struct — максимум гибкостиНужен, когда к ошибке хочется прикрепить данные (код, поле, статус). Достаточно реализовать метод
Error() string — и тип становится ошибкой.type ValidationError struct {
Field string
Msg string
}
func (e *ValidationError) Error() string {
return fmt.Sprintf("%s: %s", e.Field, e.Msg)
}Такую ошибку потом можно вытащить через
errors.As и прочитать её поля.🐸 Библиотека Go для собеса