Error в Go — это интерфейс с одним методом:
type error interface {
Error() string
}
Ошибки возвращаются как последнее значение и проверяются явно:
f, err := os.Open("file.txt")
if err != nil {
return fmt.Errorf("не смог открыть: %w", err) // wrap
}
defer f.Close()
Кастомные ошибки:
type NotFoundError struct {
ID int
}
func (e *NotFoundError) Error() string {
return fmt.Sprintf("not found: %d", e.ID)
}
Проверка типа ошибки (Go 1.13+):
var nfe *NotFoundError
if errors.As(err, &nfe) {
// работаем с nfe.ID
}
if errors.Is(err, os.ErrNotExist) {
// точное сравнение по цепочке wrap
}
%w в fmt.Errorf оборачивает ошибку, сохраняя цепочку для Is/As.