Por qué existe context.Context
Cancelación y gestión del ciclo de vida de las solicitudes
Por qué existe context.Context es una lección gratuita de Go Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Go Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Go Academy incluye 4 lecciones en total.
El problema
Sin un mecanismo para cancelar el trabajo en curso, una consulta lenta a una base de datos o una llamada HTTP bloquea su goroutine hasta que termina, desperdiciando recursos cuando la solicitud original ya se ha abandonado.
Descripción general de context.Context
context.Context es una interfaz que transporta una señal de cancelación, una fecha límite opcional y metadatos de clave-valor entre los límites de las API y las goroutines.
type Context interface {
Deadline() (deadline time.Time, ok bool)
Done() <-chan struct{}
Err() error
Value(key any) any
}El canal Done
ctx.Done() devuelve un canal que se cierra cuando el contexto se cancela o se agota el tiempo de espera. Las goroutines lo consultan mediante select para detectar la cancelación.
select {
case result := <-workCh:
return result, nil
case <-ctx.Done():
return nil, ctx.Err()
}context.Background()
context.Background() es el contexto raíz: nunca se cancela, no tiene fecha límite ni transporta valores. Utilícelo al inicio de una solicitud, en main o en las pruebas.
context.TODO()
context.TODO() también es un contexto raíz que no se puede cancelar. Se utiliza como marcador provisional cuando todavía no se dispone del contexto correcto. Comunica la intención a quienes revisan el código.
¿Por qué pasar Context como primer argumento?
Por convención, el primer parámetro de cualquier función que se pueda cancelar es ctx context.Context. Esto hace que la cancelación sea explícita y fácil de descubrir en las API.
func FetchUser(ctx context.Context, id int) (*User, error) {
return db.QueryContext(ctx, "SELECT ...", id)
}La cancelación se propaga
La cancelación de un contexto principal cancela todos los contextos secundarios derivados. Esto permite que una sola llamada de cancelación detenga todo un árbol de goroutines y operaciones.
Lo que no es Context
Context no es un contenedor genérico de valores; utilícelo únicamente para datos asociados a una solicitud, como identificadores de seguimiento o tokens de autenticación, no para parámetros opcionales. Mantenga los valores en estructuras tipadas.
Integración con la biblioteca estándar
El cliente HTTP, el controlador SQL, gRPC y muchos paquetes de terceros de la biblioteca estándar aceptan un Context, lo que permite que la cancelación se propague por toda la pila de llamadas.
Almacenar Context en una estructura
No almacene un Context dentro de una estructura. Páselo explícitamente como argumento de una función. Almacenarlo hace que la duración de la cancelación sea opaca y suele provocar errores.
Context es inmutable
Un Context es inmutable: se derivan nuevos contextos envolviéndolo con WithCancel, WithDeadline, WithTimeout o WithValue. El contexto principal no se modifica.
Comprobación rápida
¿Qué devuelve ctx.Done()?
Repaso: context.Context
Puntos clave:
- Transporta cancelación, fecha límite y metadatos entre goroutines
- Páselo como primer argumento; nunca lo almacene en estructuras
- El canal ctx.Done() se cierra al cancelar o agotarse el tiempo de espera
- La cancelación se propaga del contexto principal a todos sus secundarios
Preguntas frecuentes
¿La lección «Por qué existe context.Context» es gratis?
Sí — el texto completo de «Por qué existe context.Context» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Go Academy, actualiza a CoddyKit PRO. El curso de Go Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Por qué existe context.Context»?
Cancelación y gestión del ciclo de vida de las solicitudes Practicas Go Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Go Academy?
No se requiere experiencia previa. Go Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.
¿Cuánto tiempo toma la lección «Por qué existe context.Context»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Go Academy?
Sí. Cada lección de Go Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Por qué existe context.Context
- WithCancel y WithTimeout
- WithDeadline y WithValue
- Context en llamadas HTTP y de base de datos