Hvorfor context.Context finnes
Kansellering og håndtering av forespørslers livssyklus
Hvorfor context.Context finnes er en gratis leksjon i Go Academy på CoddyKit. Dette er leksjon 1 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Go Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Go Academy inneholder totalt 4 leksjoner.
Problemet
Uten en mekanisme for å kansellere arbeid som pågår, blokkerer en treg databaseforespørsel eller HTTP-kall goroutinen til operasjonen er ferdig. Det sløser med ressurser når den opprinnelige forespørselen allerede er forlatt.
Oversikt over context.Context
context.Context er et grensesnitt som fører med seg et kanselleringssignal, en valgfri deadline og metadata i form av nøkkel-verdi-par på tvers av API-grenser 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 som lukkes når context kanselleres eller tidsavbruddet utløper. Goroutines bruker select på den for å oppdage kansellering.
select {
case result := <-workCh:
return result, nil
case <-ctx.Done():
return nil, ctx.Err()
}context.Background()
context.Background() er rotkonteksten – den kanselleres aldri, har ingen deadline og fører ikke med seg verdier. Bruk den øverst i en forespørsel, i main eller i tester.
context.TODO()
context.TODO() er også en rotkontekst som ikke kan kanselleres. Den brukes som plassholder når riktig context ennå ikke er tilgjengelig, og kommuniserer hensikten til andre som gjennomgår koden.
Hvorfor sende Context som første argument?
Etter konvensjonen er den første parameteren til enhver funksjon som kan kanselleres, ctx context.Context. Dette gjør kansellering tydelig og lett å oppdage i API-er.
func FetchUser(ctx context.Context, id int) (*User, error) {
return db.QueryContext(ctx, "SELECT ...", id)
}Kansellering videreføres
Når en overordnet context kanselleres, kanselleres alle avledede underordnede contexter. Dermed kan ett enkelt kanselleringskall stoppe et helt tre av goroutines og operasjoner.
Hva Context ikke er
Context er ikke en generell beholder for verdier – bruk den bare for forespørselsspesifikke data, som sporings-ID-er eller autentiseringstokener, ikke for valgfrie parametere. Oppbevar verdier i typede strukturer.
Integrasjon med standardbiblioteket
Standardbibliotekets HTTP-klient, SQL-driver, gRPC og mange tredjepakker godtar en Context, slik at kansellering kan videreføres gjennom hele kallstakken.
Lagre Context i en struktur
Ikke lagre en Context i en struktur. Send den eksplisitt som et funksjonsargument. Lagring gjør levetiden for kanselleringen uklar og fører ofte til feil.
Context er uforanderlig
En Context er uforanderlig – De oppretter avledede contexter ved å pakke inn med WithCancel, WithDeadline, WithTimeout eller WithValue. Den overordnede konteksten endres ikke.
Hurtigsjekk
Hva returnerer ctx.Done()?
Oppsummering: context.Context
Viktige punkter:
- Fører med seg kansellering, deadline og metadata på tvers av goroutines
- Sendes som første argument; skal aldri lagres i strukturer
- Kanalen ctx.Done() lukkes ved kansellering eller timeout
- Kansellering videreføres fra overordnet context til alle underordnede
Lær deg Go med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 51
- Leksjoner
- 203
Ofte stilte spørsmål
Er leksjonen «Hvorfor context.Context finnes» gratis?
Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Go Academy, inkludert «Hvorfor context.Context finnes», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Go Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Hvorfor context.Context finnes»?
Kansellering og håndtering av forespørslers livssyklus Du øver på Go Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Go Academy?
Ingen tidligere erfaring er nødvendig. Go Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.
Hvor lang tid tar leksjonen «Hvorfor context.Context finnes»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Go Academy-leksjonen?
Ja. Alle Go Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Hvorfor context.Context finnes
- WithCancel og WithTimeout
- WithDeadline og WithValue
- Context i HTTP- og databasekall