typestar

Errores desde goroutines en Go

Una goroutine no puede retornar, así que el error viaja por un canal.

var ErrFetch = errors.New("fetch failed")

type result struct {
    url string
    err error
}

func fetchAll(urls []string) error {
    results := make(chan result, len(urls))
    var wg sync.WaitGroup

    for _, url := range urls {
        wg.Go(func() {
            var err error
            if strings.HasPrefix(url, "bad") {
                err = fmt.Errorf("fetch %s: %w", url, ErrFetch)
            }
            results <- result{url: url, err: err}
        })
    }
    wg.Wait()
    close(results)

    var problems error
    for r := range results {
        problems = errors.Join(problems, r.err)
    }
    return problems
}

Cómo funciona

  1. Cada worker envía su resultado, error incluido.
  2. El recolector decide si una falla detiene todo.
  3. Nunca te limites a loguearlo y soltarlo dentro de la goroutine.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
29
Caracteres a escribir
501
Tokens
136
Ritmo de tres estrellas
110 tpm

Al ritmo de tres estrellas de 110 tokens por minuto, este intento toma unos 74 segundos.

Escribe este fragmento

Paso 1 de 1 en Errores entre goroutines; paso 14 de 15 en Errores.

← Anterior Siguiente →