---
name: retry_with_backoff
kind: function
lang: go
domain: core
version: "1.0.0"
purity: impure
signature: "func RetryWithBackoff[T any](fn func() (T, error), maxRetries int, baseDelay time.Duration) (T, error)"
description: "Reintenta una funcion impura con backoff exponencial. El delay entre intento i e i+1 es baseDelay * 2^i. Retorna el primer resultado exitoso o el ultimo error tras agotar los reintentos."
tags: [retry, backoff, resilience, generic]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: "error_go_core"
imports: []
params:
  - name: fn
    desc: "función impura a reintentar; retorna (resultado, error)"
  - name: maxRetries
    desc: "número máximo de reintentos después del intento inicial"
  - name: baseDelay
    desc: "delay base en time.Duration; cada reintento usa baseDelay * 2^i"
output: "primer (resultado, nil) exitoso, o último error si se agotan los reintentos"
tested: false
tests: []
test_file_path: ""
file_path: "functions/core/retry_with_backoff.go"
---

## Ejemplo

```go
result, err := RetryWithBackoff(func() (string, error) {
    resp, err := http.Get("https://api.example.com/data")
    if err != nil {
        return "", err
    }
    defer resp.Body.Close()
    return "ok", nil
}, 3, 100*time.Millisecond)
// Intenta hasta 4 veces (1 inicial + 3 reintentos)
// Delays: 100ms, 200ms, 400ms
```

## Notas

Funcion impura generica que usa time.Sleep para el backoff. El numero total de intentos es maxRetries + 1 (el intento inicial mas los reintentos). Si maxRetries es negativo retorna error inmediatamente.
