Kontekst on Go üks kriitilisi funktsioone, mis võimaldab samaaegsust. Teenuses Go viitab kontekst paketile, mis pakub funktsioone päringu ulatusega väärtuste ja tühistamissignaalide jaoks üle API piiride.
Kontekstipakett töötab samaaegselt Go samaaegsusmudeliga, mis põhineb gorutiinide kontseptsioonil. Goroutines on kerged täitmislõimed, mida saate tõhusalt luua ja hallata, muutes Go's samaaegsete programmide loomise lihtsaks.
Konteksti pakett
Kontekstipakett pakub funktsioone pikaajaliste funktsioonide või tervete kõneahelate tühistamiseks. Pakett aitab salvestada ka päringu ulatusega väärtusi, et pääseda ligi kõikjal kõneahelas. See funktsioon on sellega töötamisel mugav API-d või mikroteenused, kus päringud võivad hõlmata mitut funktsioonikutset ja soovite need tühistada või lisada neile konkreetseid väärtusi.
Siit saate teada, kuidas saate kontekstipaketi importida Mine programmidesse.
importida"Sisu"
Kontekstifunktsioonid võtavad sisse Kontekst kontekstipaketi struct tüüpi. Tavaliselt peaksite kasutama ctx eksemplari muutuja nimena.
funcoperatsioonid(ctx kontekst. Kontekst) {
}
Funktsioonid võivad teiste funktsioonide ja toimingute jaoks tagastada kontekstistruktuuri tüübi.
funcoperatsioonid(ctx kontekst. Kontekst)Sisu.Kontekst {
}
Saate luua uue konteksti rakendusega TEGEMA kontekstipaketi funktsioon. Funktsioon TODO loob väärtusega uue konteksti Sisu. Valmis (), kanal, mis konteksti tühistamise korral suletakse. Peaksite seda kasutama kohatäitena, kui vajate konteksti, kuid ükski vanemkontekst ei sobi.
importida"Sisu"
funcpeamine() {
ctx := kontekst. TEGEMA()
}
Teise võimalusena on Taust funktsioon loob uue konteksti ilma väärtuseta ja tühja Done kanali.
ctx := kontekst. Taust()
Peaksite kasutama taustafunktsiooni kontekstipuu juurena.
Kontekst väärtustega
Kontekstipakett pakub funktsioone väärtuste ja tühistamissignaalide levitamiseks. Saate kasutada väärtusi teabe jaoks alates päringu ulatusega andmetest kuni tühistamissignaalide ja tähtaegadeni.
Kontekstipakett võimaldab luua ka vanemate kontekstidest päritud alamkonteksti, mis võimaldab tõhusat toimimist väärtuste ja tühistamissignaalide käsitlemine kogu programmis, kuna saate konteksti läbida mitmest funktsioonid.
Siin on näide konteksti funktsioonide kaudu kontekstipaketiga konteksti edastamisest.
importida (
"Sisu"
)funcväärtuslik kontekst(ctx kontekst. Kontekst)Sisu.Kontekst {
tagasi Sisu. WithValue (ctx, "pääsuvõti", "hfouneqcelkwfu")
}
funcsaadaContextData(ctx kontekst. Kontekst)ükskõik milline {
passKey := ctx. Väärtus("pääsuvõti")
tagasi passKey
}
The väärtuslik kontekst funktsioon võtab kontekstieksemplari ja tagastab järgmise funktsiooni kontekstieksemplari. Kontekstieksemplar on väärtus, mis on loodud rakendusega With Value meetod. Meetod WithValue võtab konteksti eksemplari funktsioonist ja võtme-väärtuse paarist.
Kontekstist andmete toomiseks peate looma uue konteksti rakendusega TEGEMA või Taust funktsioon ja edastada kontekst funktsioonile (antud juhul valueContext) ja saada kontekst koos saadaContextData funktsiooni.
funcpeamine() {
ctx := kontekst. Taust()
ctx = väärtuslik kontekst (ctx)
fmt. Println (saada kontekstandmeid (ctx))
}
Muutuja ctx on taustafunktsiooni kontekstieksemplar. Funktsioon valueContext võtab sisse muutuja ctx ja tagastab konteksti väärtusega, mille funktsioon ReceiveContextData võtab, ja tagastab väärtuse võtme-väärtuste paarist.
Konteksti ajalõpud ja tähtajad
The Sisu pakett pakub funktsionaalsust operatsioonide ajalõppude ja tähtaegade seadmiseks. Aegumiste ja tähtaegade seadmine on abiks toimingutele, mis vajavad järelejõudmist.
Aegumised on ajavahemik, mille jooksul toimingul kulub. Saate määrata toimingu ajalõpu 4 sekundiks; pärast seda tühistab kontekst taotluse.
Teisest küljest määrab tähtaeg absoluutse punkti, kus toiming peaks tühistama.
Võite kasutada Timeoutiga meetod konteksti ajalõpu määramiseks. Siit saate teada, kuidas saate määrata 2-sekundilise ajalõpu.
funcpeamine() {
ctx, tühista := kontekst. WithTimeout (kontekst. Taust(), 2 *aeg. Teine)
edasi lükata tühista()
// mingi operatsioon
}
The peamine funktsioon loob konteksti kahesekundilise ajalõpuga. Funktsioon WithTimeout tagastab tühistamisfunktsiooni, mille tühistamist saate põhifunktsioonist väljumisel edasi lükata.
Tähtaegu saate deklareerida Tähtajaga meetod. Meetod WithDeadline võtab kontekstijuhtumi ja tähtaja aja.
functee midagi(ctx kontekst. Kontekst) {
tähtaegTime := aeg. Now().Add(1500 *aeg. Millisekund)
ctx, ctxCancel := kontekst. WithDeadline (ctx, deadlineTime)
edasi lükata ctxCancel()// mingi operatsioon
ctxCancel()
}
The tee midagi funktsioon võtab konteksti ja tähtaegAeg muutuja on aeg enne Sisu tähtaeg. The ctx muutuja on tähtajaga kontekst.
The ctxTühista muutuja tühistab konteksti, kui kontekst ületab oma tähtaja.
Kontekstide kasutamise parimad tavad rakenduses Go
Vältige kontekstide kasutamist globaalsete muutujatena. Kontekstide kasutamine globaalsete muutujatena võib põhjustada ootamatut koodikäitumist ja raskesti jälgitavaid vigu ning kasutada konteksti säästlikult, et vähendada koodi keerukust.
Lõpuks kasutage kontekste signaalidena, mitte garantiidena. Konteksti tühistamine ei garanteeri, et kõik gorutiinid lakkavad töötamast. see on lihtsalt signaal ja gorutiinid on konteksti agnostikud.