Läsare som du hjälper till att stödja MUO. När du gör ett köp med hjälp av länkar på vår webbplats kan vi tjäna en affiliate-provision. Läs mer.

Kontext är en av de kritiska funktionerna i Go som möjliggör samtidighet. I Go hänvisar "kontext" till ett paket som tillhandahåller funktionalitet för värden med förfrågningar och avbrytande signaler över API-gränser.

Kontextpaketet fungerar samtidigt med Gos samtidighetsmodell, baserad på konceptet goroutiner. Goroutiner är lätta exekveringstrådar som du kan skapa och hantera effektivt, vilket gör det enkelt att skapa samtidiga program i Go.

Kontextpaketet

Kontextpaketet ger funktionalitet för att avbryta långvariga funktioner eller hela samtalskedjor. Paketet hjälper också till med att lagra värden med begäran omfattning för åtkomst var som helst i samtalskedjan. Denna funktion är praktisk när du arbetar med API: er eller mikrotjänster, där förfrågningar kan sträcka sig över flera funktionsanrop och du vill avbryta dem eller bifoga specifika värden till dem.

instagram viewer

Så här kan du importera sammanhangspaketet i din Gå program.

importera"sammanhang"

Kontextfunktioner tar in Sammanhang struct-typ för sammanhangspaketet. Konventionellt bör du använda ctx som namnet på instansvariabeln.

funcoperationer(ctx sammanhang. Sammanhang) {
}

Funktioner kan returnera Context struct-typen för andra funktioner och operationer.

funcoperationer(ctx sammanhang. Sammanhang)sammanhang.Sammanhang {
}

Du kan skapa ett nytt sammanhang med ATT GÖRA kontextpaketets funktion. TODO-funktionen skapar ett nytt sammanhang med värdet av sammanhang. Gjort(), en kanal som stänger vid avbrytning av kontext. Du bör använda den som en platshållare när du behöver ett sammanhang men inga överordnade sammanhang är lämpliga.

importera"sammanhang"

funchuvud() {
ctx := sammanhang. ATT GÖRA()
}

Alternativt Bakgrund funktionen skapar ett nytt sammanhang utan värde och en tom Klar-kanal.

ctx := sammanhang. Bakgrund()

Du bör använda bakgrundsfunktionen som roten till ett sammanhangsträd.

Sammanhang Med Värden

Kontextpaketet tillhandahåller funktionalitet för att sprida värden och avbrytningssignaler. Du kan använda värdena för information från begäran-omfattade data till annulleringssignaler och deadlines.

Kontextpaketet tillåter också skapandet av barnkontext som ärvts från överordnade sammanhang, vilket möjliggör effektiv hantering av värden och avbrytningssignaler genom ett program eftersom du kan skicka sammanhanget genom flera funktioner.

Här är ett exempel på att föra sammanhang genom funktioner med sammanhangspaketet.

importera (
"sammanhang"
)

funcvärdefull kontext(ctx sammanhang. Sammanhang)sammanhang.Sammanhang {
lämna tillbaka sammanhang. WithValue (ctx, "lösenord", "hfouneqcelkwfu")
}

funcmottaContextData(ctx sammanhang. Sammanhang)några {
lösenord := ctx. Värde("lösenord")
lämna tillbaka lösenord
}

De värdefull kontext funktion tar in en kontextinstans och returnerar en kontextinstans för följande funktion. Kontextinstansen är ett värde skapat med WithValue metod. WithValue-metoden tar kontextinstansen från funktionen och ett nyckel-värdepar.

För att hämta data från sammanhanget måste du skapa ett nytt sammanhang med ATT GÖRA eller Bakgrund funktion och skicka kontexten till funktionen (i det här fallet valuableContext) och ta emot sammanhanget med mottaContextData fungera.

funchuvud() {
ctx := sammanhang. Bakgrund()
ctx = värdefull kontext (ctx)
fmt. Println (receiveContextData (ctx))

}

Variabeln ctx är kontextinstansen från bakgrundsfunktionen. Funktionen valuableContext tar in ctx-variabeln och returnerar sammanhanget med ett värde som funktionen receiveContextData tar in och returnerar värdet från nyckel-värdeparet.

Kontext Timeouts och Deadlines

De sammanhang paketet ger funktionalitet för att ställa in timeouts och deadlines i verksamheten. Att ställa in timeouts och deadlines är till hjälp för operationer som behöver komma ikapp.

Timeouts är hur lång tid en operation tar. Du kan ställa in en timeout för en operation som tar 4 sekunder; efter det avbryter sammanhanget begäran.

Å andra sidan definierar en deadline den absoluta punkten där en operation ska avbrytas.

Du kan använda Med Timeout metod för att ställa in en kontext timeout. Så här kan du ställa in en 2-sekunders timeout.

funchuvud() {
ctx, avbryt := sammanhang. WithTimeout (sammanhang. Bakgrund(), 2 * tid. Andra)
uppskjuta Avbryt()

// någon operation
}

De huvud funktionen skapar ett sammanhang med en timeout på två sekunder. Funktionen WithTimeout returnerar en avbrytningsfunktion som du kan skjuta upp för avbrytning när huvudfunktionen avslutas.

Du kan deklarera tidsfrister med WithDeadline metod. WithDeadline-metoden tar i en kontextinstans och en deadlinetid.

funcgöra någonting(ctx sammanhang. Sammanhang) {
deadlineTid := tid. Nu(). Lägg till(1500 * tid. millisekund)
ctx, ctxCancel := sammanhang. WithDeadline (ctx, deadlineTime)
uppskjuta ctxCancel()

// någon operation

ctxCancel()
}

De göra någonting funktion tar in ett sammanhang, och deadlineTid variabel är tiden före sammanhang deadline. De ctx variabel är sammanhanget med en deadline.

De ctxCancel variabel avbryter sammanhanget när sammanhanget överskrider dess deadline.

Bästa metoder för att använda sammanhang i farten

Undvik att använda sammanhang som globala variabler. Att använda sammanhang som globala variabler kan leda till oväntade kodbeteenden och svåra att spåra fel, och använd kontext sparsamt för att minska kodkomplexiteten.

Använd slutligen sammanhang som signaler, inte garantier. Att avbryta ett sammanhang garanterar inte att alla goroutiner kommer att sluta köra; det är bara en signal, och goroutiner är agnostiker av sammanhang.