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
}