WithDeadline e WithValue
Scadenze assolute e passaggio di valori associati alla richiesta
WithDeadline e WithValue è una lezione Go Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Go Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Go Academy include 4 lezioni in totale.
context.WithDeadline
WithDeadline crea un context che si cancella a un'ora assoluta. Se il padre ha già una deadline precedente, prevale la deadline del padre.
deadline := time.Now().Add(10 * time.Second)
ctx, cancel := context.WithDeadline(parent, deadline)
defer cancel()WithTimeout e WithDeadline
WithTimeout(parent, d) equivale a WithDeadline(parent, time.Now().Add(d)). Utilizzi WithDeadline quando dispone di una scadenza assoluta, ad esempio proveniente da un'intestazione RPC in ingresso.
Lettura della scadenza
Esamini la scadenza di qualsiasi context con ctx.Deadline(). Il valore booleano indica se esiste una scadenza.
if deadline, ok := ctx.Deadline(); ok {
fmt.Println("expires at:", deadline)
}context.WithValue
WithValue associa una coppia chiave-valore al context. Il codice a valle la 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
}Prevenzione delle collisioni tra chiavi
Utilizzi per le chiavi un tipo non esportato specifico del package, così da evitare collisioni tra package. Non utilizzi mai direttamente tipi predefiniti, come string e int, come chiavi del context.
// Bad: string key can collide
ctx = context.WithValue(ctx, "user", u)
// Good: package-scoped type
type userKeyType struct{}
ctx = context.WithValue(ctx, userKeyType{}, u)Cosa memorizzare nel context
Memorizzi solo valori associati alla richiesta che attraversano i confini delle API: trace ID, token di autenticazione e request ID. Non memorizzi argomenti opzionali delle funzioni né stato mutabile.
Prestazioni di WithValue
ctx.Value esegue una ricerca lineare lungo la catena dei context. Eviti di memorizzare molti valori in ogni context; per più valori, li raggruppi in un'unica struct.
type RequestMeta struct {
UserID int
TraceID string
}
type metaKey struct{}
ctx = context.WithValue(ctx, metaKey{}, RequestMeta{...})Propagazione dei valori attraverso il middleware
Il middleware HTTP è il punto canonico in cui associare i metadati della richiesta al context e recuperarli negli 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
Sostituisca il context di una richiesta HTTP utilizzando r.WithContext(ctx). Viene creata una copia superficiale della richiesta con il nuovo context, lasciando invariato quello originale.
Propagazione della scadenza
Quando un gateway imposta una scadenza nel context e passa la richiesta a valle, tutti i servizi che accettano il context rispettano automaticamente la scadenza senza una logica di timeout esplicita.
Catena dei context
Ogni WithValue, WithCancel e WithTimeout avvolge il context genitore in un nuovo nodo. ctx.Value percorre la catena finché non trova la chiave o raggiunge un context radice che restituisce nil.
Verifica rapida
Perché le chiavi del context devono essere tipi non esportati specifici del package?
Riepilogo: WithDeadline e WithValue
Punti chiave:
- WithDeadline annulla l'operazione a un'ora assoluta; WithTimeout utilizza una durata relativa
- ctx.Deadline() legge la scadenza
- Utilizzi WithValue per i metadati associati alla richiesta e chiavi tipizzate non esportate
- Raggruppi più valori in una struct per ridurre la profondità della catena
Domande Frequenti
La lezione «WithDeadline e WithValue» è gratuita?
Sì — il testo completo di «WithDeadline e WithValue» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Go Academy, passa a CoddyKit PRO. Il corso Go Academy include 4 lezioni in totale.
Cosa imparerò in «WithDeadline e WithValue»?
Scadenze assolute e passaggio di valori associati alla richiesta Eserciti Go Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Go Academy?
Non è richiesta alcuna esperienza precedente. Go Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.
Quanto tempo richiede la lezione «WithDeadline e WithValue»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Go Academy?
Sì. Ogni lezione Go Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Perché esiste context.Context
- WithCancel e WithTimeout
- WithDeadline e WithValue
- Context nelle chiamate HTTP e al database