defer и именование функции?

Middle+
468 просмотров
AFK Offer AI

defer с именованными return-значениями позволяет изменить результат функции:

func divide(a, b float64) (result float64, err error) {
    defer func() {
        if r := recover(); r != nil {
            err = fmt.Errorf("panic: %v", r)
            result = 0
        }
    }()
    return a / b, nil
}

Ключевой момент: defer-функция имеет доступ к именованным return-переменным по ссылке. Это работает потому что defer выполняется ПОСЛЕ вычисления return-выражения, но ДО фактического возврата из функции.

Типичные применения:

  • Обработка паники через recover
  • Обёртывание ошибок: defer func() { if err != nil { err = fmt.Errorf("op failed: %w", err) } }()
  • Модификация результата в зависимости от cleanup-логики

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

Что такое epoll?