Hvorfor findes context.Context?
Annullering og håndtering af request-livscyklus
Hvorfor findes context.Context? er en gratis Go Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Go Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Go Academy-kurset indeholder 4 lektioner i alt.
Problemet
Uden en mekanisme til at annullere igangværende arbejde blokerer en langsom databaseforespørgsel eller et HTTP-kald dens goroutine, indtil den er færdig. Det spilder ressourcer, når den oprindelige request allerede er blevet opgivet.
Oversigt over context.Context
context.Context er et interface, der fører et annulleringssignal, en valgfri deadline og metadata i form af nøgle-værdi-par på tværs af API-grænser og goroutines.
type Context interface {
Deadline() (deadline time.Time, ok bool)
Done() <-chan struct{}
Err() error
Value(key any) any
}Done-kanalen
ctx.Done() returnerer en kanal, der lukkes, når context annulleres eller får timeout. Goroutines bruger select på den for at registrere annullering.
select {
case result := <-workCh:
return result, nil
case <-ctx.Done():
return nil, ctx.Err()
}context.Background()
context.Background() er root-context — den annulleres aldrig, har ingen deadline og indeholder ingen værdier. Brug den øverst i en request, i main eller i tests.
context.TODO()
context.TODO() er også en root-context, der ikke kan annulleres. Den bruges som placeholder, når den korrekte context endnu ikke er tilgængelig. Den kommunikerer hensigten til code reviewers.
Hvorfor give Context som første argument?
Efter konvention er den første parameter i enhver funktion, der kan annulleres, ctx context.Context. Det gør annullering tydelig og nem at finde i API'er.
func FetchUser(ctx context.Context, id int) (*User, error) {
return db.QueryContext(ctx, "SELECT ...", id)
}Annullering videresendes
Når en parent-context annulleres, annulleres alle afledte child-contexts. Det gør det muligt for ét annulleringskald at stoppe et helt træ af goroutines og operationer.
Hvad Context ikke er
Context er ikke en universal beholder til værdier — brug den kun til request-afgrænsede data som trace-id'er eller auth-tokens, ikke til valgfrie parametre. Opbevar værdier i typede structs.
Integration med standardbiblioteket
Standardbibliotekets HTTP-klient, SQL-driver, gRPC og mange tredjepartspakker accepterer en Context, så annullering kan videresendes gennem hele kaldestakken.
Lagring af Context i en struct
Gem ikke en Context i en struct. Giv den eksplicit videre som et funktionsargument. Lagring af den gør annulleringslevetiden uklar og fører ofte til fejl.
Context er uforanderlig
En Context er uforanderlig — du udleder nye contexts ved at omslutte den med WithCancel, WithDeadline, WithTimeout eller WithValue. Parent-contexten ændres ikke.
Hurtigt tjek
Hvad returnerer ctx.Done()?
Opsummering: context.Context
Vigtige pointer:
- Fører annullering, deadline og metadata på tværs af goroutines
- Giv den videre som første argument; gem den aldrig i structs
- Kanalen ctx.Done() lukkes ved annullering eller timeout
- Annullering videresendes fra parent-contexten til alle children
Lær Go med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 51
- Lektioner
- 203
Ofte stillede spørgsmål
Er lektionen “Hvorfor findes context.Context?” gratis?
Ja — alle 3 lektioner i læringssporet Go Academy, inklusive “Hvorfor findes context.Context?”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Go Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Hvorfor findes context.Context?”?
Annullering og håndtering af request-livscyklus Du øver dig i Go Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Go Academy?
Der kræves ingen tidligere erfaring. Go Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.
Hvor lang tid tager lektionen “Hvorfor findes context.Context?”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Go Academy-lektion?
Ja. Alle Go Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Hvorfor findes context.Context?
- WithCancel og WithTimeout
- WithDeadline og WithValue
- Context i HTTP- og databasekald