WithDeadline y WithValue
Plazos absolutos y transmisión de valores asociados a una solicitud
WithDeadline y WithValue es una lección gratuita de Go Academy en CoddyKit. Esta es la lección 3 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.
context.WithDeadline
WithDeadline crea un contexto que se cancela en un momento absoluto. Si el contexto principal ya tiene una fecha límite anterior, prevalece la fecha límite del contexto principal.
deadline := time.Now().Add(10 * time.Second)
ctx, cancel := context.WithDeadline(parent, deadline)
defer cancel()WithTimeout frente a WithDeadline
WithTimeout(parent, d) equivale a WithDeadline(parent, time.Now().Add(d)). Use WithDeadline cuando tenga una expiración absoluta (por ejemplo, proveniente de una cabecera RPC entrante).
Lectura del plazo límite
Consulte el plazo límite de cualquier contexto con ctx.Deadline(). El valor booleano indica si existe un plazo límite.
if deadline, ok := ctx.Deadline(); ok {
fmt.Println("expires at:", deadline)
}context.WithValue
WithValue asocia un par clave-valor al contexto. El código posterior lo recupera con ctx.Value(key).
type ctxKey string
const userKey ctxKey = "user"
ctx := context.WithValue(parent, userKey, currentUser)
func getUser(ctx context.Context) *User {
u, _ := ctx.Value(userKey).(*User)
return u
}Prevención de colisiones entre claves
Use un tipo no exportado y específico del paquete para las claves, a fin de evitar colisiones entre paquetes. Nunca use directamente tipos incorporados (string, int) como claves de contexto.
// Bad: string key can collide
ctx = context.WithValue(ctx, "user", u)
// Good: package-scoped type
type userKeyType struct{}
ctx = context.WithValue(ctx, userKeyType{}, u)Qué almacenar en el contexto
Almacene únicamente valores asociados a la solicitud que atraviesen límites de API: ID de traza, tokens de autenticación e ID de solicitud. No almacene argumentos opcionales de funciones ni estado mutable.
Rendimiento de WithValue
ctx.Value realiza una búsqueda lineal en la cadena de contextos. Evite almacenar muchos valores en cada contexto; para varios valores, agrúpelos en una sola estructura.
type RequestMeta struct {
UserID int
TraceID string
}
type metaKey struct{}
ctx = context.WithValue(ctx, metaKey{}, RequestMeta{...})Propagación de valores mediante middleware
El middleware HTTP es el lugar habitual para asociar metadatos de la solicitud al contexto y recuperarlos en los controladores:
func Auth(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
user := authenticate(r)
ctx := context.WithValue(r.Context(), userKey, user)
next.ServeHTTP(w, r.WithContext(ctx))
})
}r.WithContext
Reemplace el contexto de una solicitud HTTP mediante r.WithContext(ctx). Esto crea una copia superficial de la solicitud con el nuevo contexto y deja el original sin modificar.
Propagación del plazo límite
Cuando una puerta de enlace establece un plazo límite en el contexto y pasa la solicitud a los servicios posteriores, todos los servicios que aceptan el contexto respetan automáticamente dicho plazo sin lógica de tiempo de espera explícita.
Cadena de contextos
Cada WithValue, WithCancel y WithTimeout envuelve el contexto principal en un nodo nuevo. ctx.Value recorre la cadena hasta encontrar la clave o llegar a un contexto raíz que devuelve nil.
Comprobación rápida
¿Por qué las claves de contexto deben ser tipos no exportados y específicos del paquete?
Resumen: WithDeadline y WithValue
Puntos clave:
- WithDeadline cancela en un momento absoluto; WithTimeout usa un plazo relativo
- ctx.Deadline() consulta el plazo límite
- Use WithValue para metadatos asociados a la solicitud y claves tipadas no exportadas
- Agrupe varios valores en una estructura para reducir la profundidad de la cadena
Preguntas frecuentes
¿La lección «WithDeadline y WithValue» es gratis?
Sí — el texto completo de «WithDeadline y WithValue» 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 «WithDeadline y WithValue»?
Plazos absolutos y transmisión de valores asociados a una solicitud 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 3 de 4.
¿Cuánto tiempo toma la lección «WithDeadline y WithValue»?
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