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-логики