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
- Cada worker envía su resultado, error incluido.
- El recolector decide si una falla detiene todo.
- Nunca te limites a loguearlo y soltarlo dentro de la goroutine.
Palabras clave y builtins usados aquí
chancloseerrorforfunciflenmakerangereturnstringstructtypevar
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.
Paso 1 de 1 en Errores entre goroutines; paso 14 de 15 en Errores.