Kaltaisesi lukijat auttavat tukemaan MUO: ta. Kun teet ostoksen käyttämällä sivustollamme olevia linkkejä, voimme ansaita kumppanipalkkion. Lue lisää.

Konteksti on yksi Go: n kriittisistä ominaisuuksista, jotka mahdollistavat samanaikaisuuden. Gossa "konteksti" tarkoittaa pakettia, joka tarjoaa toimintoja pyyntölaajuisille arvoille ja peruutussignaaleille API-rajojen yli.

Kontekstipaketti toimii samanaikaisesti Go: n samanaikaisuusmallin kanssa, joka perustuu gorutiinien käsitteeseen. Gorutines ovat kevyitä suoritussäikeitä, joita voit luoda ja hallita tehokkaasti, mikä tekee samanaikaisten ohjelmien luomisesta helppoa Gossa.

Kontekstipaketti

Kontekstipaketti tarjoaa toiminnot pitkäaikaisten toimintojen tai kokonaisten puheluketjujen peruuttamiseen. Paketti auttaa myös tallentamaan pyyntökohtaisia ​​arvoja pääsyä varten kaikkialle puheluketjussa. Tämä ominaisuus on kätevä työskennellessäsi API: t tai mikropalvelut, joissa pyynnöt voivat kattaa useita funktiokutsuja ja haluat peruuttaa ne tai liittää niihin tiettyjä arvoja.

Näin voit tuoda kontekstipaketin omaan Mene ohjelmiin.

tuonti"konteksti"

Kontekstifunktiot ottavat vastaan Konteksti kontekstipaketin struct-tyyppi. Perinteisesti kannattaa käyttää ctx esiintymän muuttujan nimenä.

functoiminnot(ctx konteksti. konteksti) {
}

Funktiot voivat palauttaa Context-rakennetyypin muille funktioille ja operaatioille.

functoiminnot(ctx konteksti. konteksti)yhteydessä.Konteksti {
}

Voit luoda uuden kontekstin TEHDÄ kontekstipaketin toiminto. TODO-funktio luo uuden kontekstin arvolla yhteydessä. Tehty(), kanava, joka sulkeutuu kontekstin peruutuksen yhteydessä. Sinun tulee käyttää sitä paikkamerkkinä, kun tarvitset kontekstin, mutta mikään ylätason konteksti ei sovellu.

tuonti"konteksti"

funcpää() {
ctx := konteksti. TEHDÄ()
}

Vaihtoehtoisesti, Tausta toiminto luo uuden kontekstin ilman arvoa ja tyhjän Done-kanavan.

ctx := konteksti. Tausta()

Sinun tulisi käyttää taustafunktiota kontekstipuun juurena.

Konteksti arvojen kanssa

Kontekstipaketti tarjoaa toimintoja arvojen ja peruutussignaalien levittämiseen. Voit käyttää arvoja tiedoille pyyntölaajuisista tiedoista peruutussignaaleihin ja määräaikoihin.

Kontekstipaketti mahdollistaa myös vanhempien konteksteista perityn lapsikontekstin luomisen, mikä mahdollistaa tehokkaan käytön arvojen ja peruutussignaalien käsittely koko ohjelmassa, koska voit siirtää kontekstin useiden läpi toimintoja.

Tässä on esimerkki kontekstin välittämisestä funktioiden läpi kontekstipaketin avulla.

tuonti (
"konteksti"
)

funcarvokasContext(ctx konteksti. konteksti)yhteydessä.Konteksti {
palata yhteydessä. WithValue (ctx, "salasana", "hfouneqcelkwfu")
}

funcvastaanottaaContextData(ctx konteksti. konteksti)minkä tahansa {
passKey := ctx. Arvo("salasana")
palata passKey
}

The arvokasContext funktio ottaa konteksti-ilmentymän ja palauttaa seuraavan funktion konteksti-ilmentymän. Konteksti-ilmentymä on arvo, joka on luotu komennolla With Value menetelmä. WithValue-menetelmä ottaa kontekstin esiintymän funktiosta ja avain-arvo-parista.

Jos haluat hakea tiedot kontekstista, sinun on luotava uusi konteksti TEHDÄ tai Tausta funktio ja välitä konteksti funktiolle (tässä tapauksessa arvokasContext) ja vastaanota konteksti funktiolla vastaanottaaContextData toiminto.

funcpää() {
ctx := konteksti. Tausta()
ctx = arvokasContext (ctx)
fmt. Println (receiveContextData (ctx))

}

ctx-muuttuja on taustaesiintymä taustafunktiosta. ValueContext-funktio ottaa vastaan ​​ctx-muuttujan ja palauttaa kontekstin arvon, jonka ReceiveContextData-funktio ottaa vastaan, ja palauttaa arvon avain-arvo-parista.

Konteksti aikakatkaisut ja määräajat

The yhteydessä paketti tarjoaa toiminnot aikakatkaisujen ja määräaikojen asettamiseen toiminnassa. Aikakatkaisujen ja määräaikojen asettaminen on hyödyllistä toimissa, joiden on päästävä kiinni.

Aikakatkaisut ovat aika, jonka toiminto kestää. Voit asettaa toiminnolle aikakatkaisun, joka kestää 4 sekuntia; sen jälkeen konteksti peruuttaa pyynnön.

Toisaalta määräaika määrittää absoluuttisen pisteen, jossa toiminnon tulee peruuttaa.

Voit käyttää With Timeout tapa asettaa kontekstin aikakatkaisu. Näin voit asettaa 2 sekunnin aikakatkaisun.

funcpää() {
ctx, peruuta := konteksti. WithTimeout (konteksti. Tausta(), 2 * aika. Toinen)
lykätä peruuttaa()

// jokin operaatio
}

The pää toiminto luo kontekstin kahden sekunnin aikakatkaisulla. WithTimeout-funktio palauttaa peruutustoiminnon, jonka peruuttamista voi lykätä pääfunktiosta poistuttaessa.

Voit ilmoittaa määräajoista WithDeadline menetelmä. WithDeadline-menetelmä ottaa kontekstin esiintymän ja määräajan.

functee jotain(ctx konteksti. konteksti) {
deadlineTime := aika. Nyt().Add(1500 * aika. millisekunti)
ctx, ctxCancel := konteksti. WithDeadline (ctx, deadlineTime)
lykätä ctxCancel()

// jokin operaatio

ctxCancel()
}

The tee jotain funktio ottaa kontekstin, ja deadlineTime muuttuja on aika ennen yhteydessä takaraja. The ctx muuttuja on konteksti, jossa on määräaika.

The ctxPeruuta muuttuja peruuttaa kontekstin, kun konteksti ylittää määräajan.

Parhaat käytännöt kontekstien käyttämiseen Gossa

Vältä käyttämästä konteksteja globaaleina muuttujina. Kontekstien käyttäminen globaaleina muuttujina voi johtaa odottamattomiin koodin käyttäytymiseen ja vaikeasti jäljitettäviin virheisiin, ja kontekstin käyttö säästeliäästi vähentää koodin monimutkaisuutta.

Käytä lopuksi konteksteja signaaleina, älä takuina. Kontekstin peruuttaminen ei takaa, että kaikki goutiinit lakkaavat toimimasta. se on vain signaali, ja gorutiinit ovat kontekstien agnostikkoja.