Læsere som dig hjælper med at støtte MUO. Når du foretager et køb ved hjælp af links på vores websted, kan vi optjene en affiliate-kommission. Læs mere.

Kontekst er en af ​​de kritiske funktioner i Go, der muliggør samtidighed. I Go refererer "kontekst" til en pakke, der giver funktionalitet til værdier med anmodningsomfang og annulleringssignaler på tværs af API-grænser.

Kontekstpakken fungerer samtidigt med Gos samtidighedsmodel, baseret på begrebet goroutiner. Goroutiner er lette udførelsestråde, som du kan oprette og administrere effektivt, hvilket gør det nemt at oprette samtidige programmer i Go.

Kontekstpakken

Kontekstpakken giver funktionalitet til at annullere langvarige funktioner eller hele opkaldskæder. Pakken hjælper også med at gemme værdier med anmodningsbestemmelser for adgang overalt i opkaldskæden. Denne funktion er praktisk, når du arbejder med API'er eller mikrotjenester, hvor anmodninger kan strække sig over flere funktionsopkald, og du ønsker at annullere dem eller knytte specifikke værdier til dem.

Sådan kan du importere kontekstpakken i din Gå programmer.

importere"sammenhæng"

Kontekstfunktioner tager i Sammenhæng struct type af kontekstpakken. Konventionelt bør du bruge ctx som navnet på instansvariablen.

funcoperationer(ctx kontekst. Sammenhæng) {
}

Funktioner kan returnere Context struct-typen for andre funktioner og operationer.

funcoperationer(ctx kontekst. Sammenhæng)sammenhæng.Sammenhæng {
}

Du kan skabe en ny kontekst med AT GØRE kontekstpakkens funktion. TODO-funktionen skaber en ny kontekst med værdien af sammenhæng. Færdig(), en kanal, der lukker ved annullering af kontekst. Du bør bruge det som en pladsholder, når du har brug for en kontekst, men ingen overordnede kontekster er egnede.

importere"sammenhæng"

funcvigtigste() {
ctx := kontekst. AT GØRE()
}

Alternativt kan Baggrund funktion opretter en ny kontekst uden værdi og en tom Udført-kanal.

ctx := kontekst. Baggrund()

Du bør bruge baggrundsfunktionen som roden til et konteksttræ.

Kontekst med værdier

Kontekstpakken giver funktionalitet til udbredelse af værdier og annulleringssignaler. Du kan bruge værdierne til information fra anmodningsbaserede data til annulleringssignaler og deadlines.

Kontekstpakken tillader også oprettelse af børnekontekst, der er nedarvet fra forældrekontekster, hvilket giver mulighed for effektiv håndtering af værdier og annulleringssignaler gennem et program, da du kan sende konteksten gennem flere funktioner.

Her er et eksempel på at sende kontekst gennem funktioner med kontekstpakken.

importere (
"sammenhæng"
)

funcværdifuldKontekst(ctx kontekst. Sammenhæng)sammenhæng.Sammenhæng {
Vend tilbage sammenhæng. WithValue (ctx, "adgangsnøgle", "hfouneqcelkwfu")
}

funcmodtageContextData(ctx kontekst. Sammenhæng)nogen {
adgangsnøgle := ctx. Værdi("adgangsnøgle")
Vend tilbage adgangsnøgle
}

Det værdifuldKontekst funktion tager en kontekstforekomst ind og returnerer en kontekstforekomst for følgende funktion. Kontekstinstansen er en værdi skabt med Med Værdi metode. WithValue-metoden tager kontekstforekomsten fra funktionen og et nøgle-værdi-par.

For at hente dataene fra konteksten skal du oprette en ny kontekst med AT GØRE eller Baggrund funktion og videregive konteksten til funktionen (i dette tilfælde valuableContext) og modtage konteksten med modtageContextData fungere.

funcvigtigste() {
ctx := kontekst. Baggrund()
ctx = værdifuldKontekst (ctx)
fmt. Println (receiveContextData (ctx))

}

Ctx-variablen er kontekstforekomsten fra funktionen Baggrund. Funktionen valuableContext tager ctx-variablen ind og returnerer konteksten med en værdi, som funktionen receiveContextData tager ind og returnerer værdien fra nøgleværdi-parret.

Kontekst timeouts og deadlines

Det sammenhæng pakken giver funktionalitet til indstilling af timeouts og deadlines i operationer. Indstilling af timeouts og deadlines er nyttigt for operationer, der skal indhente.

Timeouts er den tid, en operation tager. Du kan indstille en timeout for en operation til at tage 4 sekunder; derefter annullerer konteksten anmodningen.

På den anden side definerer en deadline det absolutte punkt, hvor en operation skal annulleres.

Du kan bruge Med Timeout metode til at indstille en kontekst-timeout. Sådan kan du indstille en 2-sekunders timeout.

funcvigtigste() {
ctx, annuller := kontekst. WithTimeout (kontekst. Baggrund(), 2 * tid. Anden)
udsætte afbestille()

// noget operation
}

Det vigtigste funktion opretter en kontekst med en timeout på to sekunder. Funktionen WithTimeout returnerer en annulleringsfunktion, som du kan udsætte til annullering, når hovedfunktionen afsluttes.

Du kan erklære frister med Med deadline metode. WithDeadline-metoden tager i en kontekstinstans og en deadline-tid.

funcgør noget(ctx kontekst. Sammenhæng) {
deadlineTid := tid. Nu().Tilføj(1500 * tid. millisekund)
ctx, ctxCancel := kontekst. WithDeadline (ctx, deadlineTime)
udsætte ctxCancel()

// noget operation

ctxCancel()
}

Det gør noget funktion tager i en kontekst, og deadlineTid variabel er tiden før sammenhæng deadline. Det ctx variabel er konteksten med en deadline.

Det ctxCancel variabel annullerer konteksten, når konteksten overskrider sin deadline.

Bedste fremgangsmåder til brug af kontekster i farten

Undgå at bruge kontekster som globale variabler. Brug af kontekster som globale variabler kan føre til uventet kodeadfærd og svære at spore fejl, og brug kontekst sparsomt til at reducere kodekompleksitet.

Brug endelig sammenhænge som signaler, ikke garantier. Annullering af en kontekst garanterer ikke, at alle goroutiner holder op med at køre; det er blot et signal, og goroutiner er agnostiske over for sammenhænge.