TIL: cancelación de context en Go
- go
- concurrencia
La cancelación solo funciona cuando cada capa acepta y reenvía el mismo context.Context. Pasarlo a consultas de base de datos, solicitudes HTTP y funciones worker permite que un timeout o una desconexión del cliente detenga trabajo que ya no tiene un llamador esperando.
La función receptora debería revisar ctx.Done() en los puntos de bloqueo y devolver ctx.Err() en vez de inventar un error centinela separado. Eso mantiene el logging y los reintentos aguas arriba ligados a la razón original de cancelación.
func fetchProfile(ctx context.Context, client *http.Client, url string) (*http.Response, error) {
req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
if err != nil {
return nil, err
}
resp, err := client.Do(req)
if err != nil {
return nil, err
}
return resp, nil
}