Как работает error в Go?

Junior
1.7k просмотров
AFK Offer AI

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.

Следующий вопрос

Как работает json.Marshal/Unmarshal?