Perché esiste context.Context
Annullamento e gestione del ciclo di vita delle richieste
Perché esiste context.Context è una lezione Go Academy gratuita su CoddyKit. Questa è la lezione 1 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.
Il problema
Senza un meccanismo per cancellare il lavoro in corso, una query lenta al database o una chiamata HTTP blocca la relativa goroutine fino al completamento, sprecando risorse quando la richiesta originale è già stata abbandonata.
Panoramica di context.Context
context.Context è un'interfaccia che trasporta un segnale di cancellazione, una deadline opzionale e metadati chiave-valore tra i confini delle API e le goroutine.
type Context interface {
Deadline() (deadline time.Time, ok bool)
Done() <-chan struct{}
Err() error
Value(key any) any
}Il canale Done
ctx.Done() restituisce un canale che viene chiuso quando il context viene cancellato o raggiunge il timeout. Le goroutine lo usano in un'istruzione select per rilevare la cancellazione.
select {
case result := <-workCh:
return result, nil
case <-ctx.Done():
return nil, ctx.Err()
}context.Background()
context.Background() è il context radice: non viene mai cancellato, non ha una deadline e non trasporta valori. Lo utilizzi all'inizio di una richiesta, in main o nei test.
context.TODO()
context.TODO() è anch'esso un context radice non cancellabile, utilizzato come segnaposto quando il context corretto non è ancora disponibile. Comunica l'intento a chi esamina il codice.
Perché passare Context come primo argomento
Per convenzione, il primo parametro di qualsiasi funzione che può essere cancellata è ctx context.Context. Questo rende la cancellazione esplicita e facilmente individuabile nelle API.
func FetchUser(ctx context.Context, id int) (*User, error) {
return db.QueryContext(ctx, "SELECT ...", id)
}La cancellazione si propaga
La cancellazione di un context padre cancella tutti i context figli derivati. In questo modo una singola chiamata di cancellazione può arrestare un intero albero di goroutine e operazioni.
Cosa non è Context
Context non è un contenitore generico di valori: lo utilizzi solo per dati associati alla richiesta, come trace ID o token di autenticazione, non per parametri opzionali. Mantenga i valori in struct tipizzate.
Integrazione nella libreria standard
Il client HTTP, il driver SQL, gRPC della libreria standard e molti pacchetti di terze parti accettano un Context, consentendo alla cancellazione di propagarsi lungo l'intero stack delle chiamate.
Memorizzare Context in una struct
Non memorizzi un Context all'interno di una struct. Lo passi esplicitamente come argomento di una funzione. Memorizzarlo rende opaca la durata della cancellazione e spesso causa bug.
Context è immutabile
Un Context è immutabile: si derivano nuovi context racchiudendoli con WithCancel, WithDeadline, WithTimeout o WithValue. Il padre non viene modificato.
Verifica rapida
Cosa restituisce ctx.Done()?
Riepilogo: context.Context
Punti chiave:
- Trasporta cancellazione, deadline e metadati tra le goroutine
- Lo passi come primo argomento; non lo memorizzi mai nelle struct
- Il canale ctx.Done() viene chiuso alla cancellazione o al timeout
- La cancellazione si propaga dal padre a tutti i figli
Domande Frequenti
La lezione «Perché esiste context.Context» è gratuita?
Sì — il testo completo di «Perché esiste context.Context» è 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 «Perché esiste context.Context»?
Annullamento e gestione del ciclo di vita delle richieste 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 1 di 4.
Quanto tempo richiede la lezione «Perché esiste context.Context»?
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