Lezers zoals jij steunen MUO. Wanneer u een aankoop doet via links op onze site, kunnen we een aangesloten commissie verdienen. Lees verder.

Context is een van de cruciale functies in Go die gelijktijdigheid mogelijk maakt. In Go verwijst 'context' naar een pakket dat functionaliteit biedt voor op verzoeken gebaseerde waarden en annuleringssignalen over API-grenzen heen.

Het contextpakket werkt gelijktijdig met het concurrency-model van Go, gebaseerd op het concept van goroutines. Goroutines zijn lichtgewicht uitvoeringsdraden die u efficiënt kunt maken en beheren, waardoor het gemakkelijk wordt om gelijktijdige programma's in Go te maken.

Het contextpakket

Het contextpakket biedt functionaliteit voor het annuleren van langlopende functies of hele oproepketens. Het pakket helpt ook bij het opslaan van op verzoek gerichte waarden voor toegang overal in de gespreksketen. Deze functie is handig bij het werken met API's of microservices, waarbij verzoeken meerdere functieaanroepen kunnen omvatten en u deze wilt annuleren of er specifieke waarden aan wilt koppelen.

Hier ziet u hoe u het contextpakket in uw kunt importeren Ga programma's.

importeren"context"

Contextfuncties nemen de Context struct-type van het contextpakket. Conventioneel zou u moeten gebruiken ctx als de naam van de instantievariabele.

funcactiviteiten(ctx-context. Context) {
}

Functies kunnen het Context-structuurtype retourneren voor andere functies en bewerkingen.

funcactiviteiten(ctx-context. Context)context.Context {
}

U kunt een nieuwe context maken met de TE DOEN functie van het contextpakket. De functie TODO creëert een nieuwe context met de waarde van context. Klaar(), een kanaal dat wordt gesloten bij annulering van de context. U moet het als tijdelijke aanduiding gebruiken wanneer u een context nodig heeft, maar geen bovenliggende contexten geschikt zijn.

importeren"context"

funcvoornaamst() {
ctx := context. TE DOEN()
}

Alternatief, de Achtergrond functie creëert een nieuwe context zonder waarde en een leeg Done-kanaal.

ctx := context. Achtergrond()

U moet de achtergrondfunctie gebruiken als de hoofdmap van een contextboom.

Context Met Waarden

Het contextpakket biedt functionaliteit voor het verspreiden van waarden en annuleringssignalen. U kunt de waarden gebruiken voor informatie van gegevens binnen het bereik van verzoeken tot annuleringssignalen en deadlines.

Het contextpakket maakt het ook mogelijk om kindcontext te creëren die is geërfd van oudercontexten, wat efficiënt is verwerking van waarden en annuleringssignalen in een programma, aangezien u de context door meerdere kunt doorgeven functies.

Hier is een voorbeeld van het doorgeven van context door functies met het contextpakket.

importeren (
"context"
)

funcwaardevolleContext(ctx-context. Context)context.Context {
opbrengst context. Met Waarde (ctx, "wachtwoord", "hfouneqcelkwfu")
}

funcontvangContextData(ctx-context. Context)elk {
passKey := ctx. Waarde("wachtwoord")
opbrengst passKey
}

De waardevolleContext functie neemt een contextinstantie op en retourneert een contextinstantie voor de volgende functie. De contextinstantie is een waarde die is gemaakt met de Met Waarde methode. De WithValue-methode neemt de contextinstantie van de functie en een sleutel-waardepaar.

Om de gegevens uit de context op te halen, moet u een nieuwe context maken met de TE DOEN of Achtergrond functie en geef de context door aan de functie (in dit geval waardevolleContext) en ontvang de context met de ontvangContextData functie.

funcvoornaamst() {
ctx := context. Achtergrond()
ctx = waardevolleContext (ctx)
fmt. Println (ContextData ontvangen (ctx))

}

De ctx-variabele is de contextinstantie van de achtergrondfunctie. De functievalueContext neemt de variabele ctx op en retourneert de context met een waarde die de functie ReceiveContextData opneemt en retourneert de waarde van het sleutel-waarde-paar.

Contexttime-outs en deadlines

De context pakket biedt functionaliteit voor het instellen van time-outs en deadlines in operaties. Het instellen van time-outs en deadlines is handig voor bewerkingen die een inhaalslag moeten maken.

Time-outs zijn de tijdsduur die een bewerking in beslag neemt. U kunt een time-out instellen voor een bewerking die 4 seconden duurt; daarna annuleert de context het verzoek.

Aan de andere kant definieert een deadline het absolute punt waarop een operatie moet worden geannuleerd.

U kunt de Met Timeout methode om een ​​contexttime-out in te stellen. Hier leest u hoe u een time-out van 2 seconden kunt instellen.

funcvoornaamst() {
ctx, annuleer := context. MetTimeout (context. Achtergrond(), 2 * tijd. Seconde)
verschuiven annuleren()

// een of andere operatie
}

De voornaamst functie creëert een context met een time-out van twee seconden. De WithTimeout-functie retourneert een annuleerfunctie die u kunt uitstellen voor annulering bij het afsluiten van de hoofdfunctie.

Deadlines kunt u aangeven bij de Met deadline methode. De WithDeadline-methode neemt een contextinstantie en een deadlinetijd in beslag.

funcdoe iets(ctx-context. Context) {
deadlineTime := tijd. Nu().Toevoegen(1500 * tijd. milliseconde)
ctx, ctxCancel := context. WithDeadline (ctx, deadlineTime)
verschuiven ctxAnnuleren()

// een of andere operatie

ctxAnnuleren()
}

De doe iets functie neemt in een context, en de deadlineTijd variabele is de tijd vóór de context deadline. De ctx variabele is de context met een deadline.

De ctxAnnuleren variabele annuleert de context wanneer de context de deadline overschrijdt.

Praktische tips voor het gebruik van contexten in Go

Vermijd het gebruik van contexten als globale variabelen. Het gebruik van contexten als globale variabelen kan leiden tot onverwacht codegedrag en moeilijk te traceren fouten, en gebruik context spaarzaam om de complexiteit van de code te verminderen.

Gebruik ten slotte contexten als signalen, niet als garanties. Het annuleren van een context garandeert niet dat alle goroutines stoppen met werken; het is slechts een signaal, en goroutines zijn agnostisch van contexten.