Golang -kontekst

Golang -kontekst
En av de mest nyttige funksjonene i Go -programmeringsspråket er kontekster. Kontekst gir allsidige funksjoner for applikasjoner som deling av data, avbestillinger, frister osv.

Kontekst er så nyttig at mange biblioteker i GO -økosystemet bruker dem. Du finner dem også i applikasjoner som samhandler med eksterne servere, databaser, API -anrop og mer.

For denne artikkelen vil vi gi en nybegynner introduksjon til kontekstpakken i Go og hvordan du bruker kontekst for forskjellige brukssaker.

Kontekst med verdien

Et av hovedbrukssakene av kontekster i GO er å dele data eller bruke forespørselsscopede verdier. Golang Context -pakken gir deg med verdifunksjonen som lar deg dele data.

Funksjonssyntaksen er som vist:

func withValue (foreldrekontekst, nøkkel, valgrensesnitt ) kontekst

Funksjonen tar en kontekst, nøkkel og verdi som parametere. Funksjonen vil da opprette en ny kontekst basert på den medfølgende overordnede og legge til en spesifisert verdi til set -tasten.

Tenk på det som en intern kontekst med en nøkkelverdipar-type inni. Du kan deretter hente eller hente verdier fra typen.

Tenk på eksemplet nedenfor som illustrerer hvordan du bruker verdifunksjonen og henter verdier fra den.

pakkehoved
Importer "FMT"
importere "kontekst"
FUNCMAIN ()
CTX: = kontekst.Bakgrunn()
CTX = AddValues ​​(CTX)
hentingValue (CTX)

FuncAddValues ​​(CTX -kontekst.Kontekst) kontekst.Kontekst
Returkontekst.WithValue (CTX, "Key", "Verdi")

FunCretriEdeValue (CTX Context.Kontekst)
Verdi: = CTX.Verdi ("Key")
fmt.Println (verdi)

Fokuser på hovedfunksjonen til koden over. Vi starter med å lage et nytt kontekstobjekt, CTX, med konteksten.Bakgrunn () Funksjon.

Bakgrunnsfunksjonen vil da returnere en tom ikke-null kontekst uten avbestillinger, ingen verdier og ingen frister.

Bakgrunnsfunksjonen fungerer som initialisering for innkommende kontekstforespørsler.

Kontekst angir verdier

Den andre delen av funksjonen er AddValues ​​() -funksjonen. Vi tar en ny kontekst og binder den til en eksisterende kontekst i dette eksemplet. Den nye konteksten har nøkkelen til å legge til konteksten.

Legg merke til at funksjonen med verdien returnerer en kopi av foreldrekonteksten og ikke endrer den eksisterende konteksten.

Kontekst henter verdier

Den andre delen av programmet er hentingValue () -funksjonen. I dette tilfellet tar vi kontekststrukturen og henter verdiene knyttet til den spesifiserte nøkkelen.

Hvis nøkkelen eksisterer i konteksten, bør funksjonen returnere den tilhørende verdien.

Hvis nøkkelen ikke eksisterer, bør funksjonen returnere null. Vi kan implementere betinget logikk for å sjekke om returverdien er null og returnerer en feil hvis det er sant.

Kontekst med timeout

En annen vanlig bruk av kontekster er å håndtere timeouts. For eksempel kan det hende du må definere en timeout i visse applikasjoner hvis en spesifisert handling ikke utføres. Dette er utrolig enkelt å implementere ved hjelp av med Timeout -funksjonen fra kontekstpakken. La oss se på hvordan vi kan implementere timeout ved hjelp av kontekstpakken.

pakkehoved
import (
"kontekst"
"FMT"
"tid"
)
FUNCMAIN ()
CTX, avbryt: = kontekst.Med tid (kontekst.Bakgrunn (), 5*tid.Sekund)
utsetter avbryt ()
CTX = AddValues ​​(CTX)
GO HENVEVALUES (CTX)
plukke ut
sak<-ctx.Done():
fmt.Println ("tok for lang tid!")

tid.Sove (5 * tid.Sekund)

FuncAddValues ​​(CTX -kontekst.Kontekst) kontekst.Kontekst
Returkontekst.WithValue (CTX, "Key", "Verdi")

FuncretriEvEvalues ​​(CTX -kontekst.Kontekst)
for
plukke ut
sak<-ctx.Done():
fmt.Println ("timeout")
komme tilbake
misligholde:
Verdi: = CTX.Verdi ("Key")
fmt.Println (verdi)

tid.Sove (1 * tid.Sekund)

I dette eksemplet definerer vi en avbrytingsfunksjon ved hjelp av konteksten.Med Timeout -funksjon. Vi kan deretter utløse avbrytsfunksjonen manuelt hvis vi synes passer.

Når tidsavbruddsverdien er nådd, kalles og kjører den spesifiserte logikken.

I vår hentingsverdifunksjon henter vi kontinuerlig verdien med den spesifiserte tasten ved å bruke for -loopen. Vi sjekker også om den ferdige kanalen fra hovedkonteksten fremdeles lever. Hvis tidsavbruddet ikke har overskredet, vil foreldrekonteksten fortsatt være åpen, men når tidsavbruddet er nådd, blir konteksten kansellert.

I vårt eksempel vil funksjonen kjøres hvert 1 -sekund før tidsavbruddet er nådd. Et eksempelutgang er som vist:

verdi
verdi
verdi
verdi
verdi
Tok for lang tid!
Pause

Konklusjon

Dette var en kort og grunnleggende opplæring som diskuterte kontekster og hvordan du bruker dem i GO -programmene dine. Du kan sjekke dokumentasjonen for å utforske mer om GO -kontekster.