WithDeadline et WithValue
Échéances absolues et transmission de valeurs liées à la requête
WithDeadline et WithValue est une leçon Go Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Go Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Go Academy comprend 4 leçons au total.
context.WithDeadline
WithDeadline crée un Context qui s’annule à une heure absolue. Si le parent possède déjà une échéance antérieure, celle du parent est prioritaire.
deadline := time.Now().Add(10 * time.Second)
ctx, cancel := context.WithDeadline(parent, deadline)
defer cancel()WithTimeout ou WithDeadline
WithTimeout(parent, d) est équivalent à WithDeadline(parent, time.Now().Add(d)). Utilisez WithDeadline lorsque vous disposez d’une échéance absolue (par exemple, provenant d’un en-tête RPC entrant).
Lire l’échéance
Inspectez l’échéance de n’importe quel contexte avec ctx.Deadline(). La valeur booléenne indique si une échéance existe.
if deadline, ok := ctx.Deadline(); ok {
fmt.Println("expires at:", deadline)
}context.WithValue
WithValue associe une paire clé-valeur au contexte. Le code en aval la récupère avec 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
}Prévenir les collisions de clés
Utilisez un type propre au paquetage et non exporté pour les clés afin d’éviter les collisions entre paquetages. N’utilisez jamais directement des types intégrés (string, int) comme clés de contexte.
// Bad: string key can collide
ctx = context.WithValue(ctx, "user", u)
// Good: package-scoped type
type userKeyType struct{}
ctx = context.WithValue(ctx, userKeyType{}, u)Que stocker dans le contexte
Ne stockez que les valeurs associées à la requête qui franchissent les limites de l’API : identifiants de trace, jetons d’authentification et identifiants de requête. Ne stockez pas d’arguments facultatifs de fonction ni d’état mutable.
Performances de WithValue
ctx.Value effectue une recherche linéaire dans la chaîne de contextes. Évitez de stocker de nombreuses valeurs par contexte ; pour plusieurs valeurs, regroupez-les dans une seule structure.
type RequestMeta struct {
UserID int
TraceID string
}
type metaKey struct{}
ctx = context.WithValue(ctx, metaKey{}, RequestMeta{...})Propager des valeurs via un intergiciel
L’intergiciel HTTP est l’endroit habituel où associer les métadonnées de la requête au contexte et les récupérer dans les handler :
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
Remplacez le contexte d’une requête HTTP avec r.WithContext(ctx). Cela crée une copie superficielle de la requête avec le nouveau contexte, sans modifier l’original.
Propagation de l’échéance
Lorsqu’une passerelle définit une échéance dans le contexte et transmet la requête en aval, tous les services qui acceptent le contexte respectent automatiquement cette échéance, sans logique explicite de délai d’expiration.
Chaîne de contextes
Chaque WithValue, WithCancel ou WithTimeout encapsule le contexte parent dans un nouveau nœud. ctx.Value parcourt la chaîne jusqu’à trouver la clé ou atteindre un contexte racine qui renvoie nil.
Vérification rapide
Pourquoi les clés de contexte doivent-elles être des types propres au paquetage et non exportés ?
Récapitulatif : WithDeadline et WithValue
Points essentiels :
- WithDeadline annule à un instant absolu ; WithTimeout utilise une durée relative
- ctx.Deadline() lit l’échéance
- WithValue sert aux métadonnées associées à la requête ; utilisez des clés typées et non exportées
- Regroupez plusieurs valeurs dans une structure pour réduire la profondeur de la chaîne
Questions Fréquemment Posées
La leçon « WithDeadline et WithValue » est-elle gratuite ?
Oui — le texte complet de « WithDeadline et WithValue » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Go Academy, passe à CoddyKit PRO. Le cours Go Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « WithDeadline et WithValue » ?
Échéances absolues et transmission de valeurs liées à la requête Tu pratiques Go Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Go Academy ?
Aucune expérience préalable n'est requise. Go Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.
Combien de temps prend la leçon « WithDeadline et WithValue » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Go Academy ?
Oui. Chaque leçon Go Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Pourquoi context.Context existe
- WithCancel et WithTimeout
- WithDeadline et WithValue
- Context dans les appels HTTP et de base de données