Kontekst je ena od kritičnih funkcij v Go, ki omogoča sočasnost. V Go se »kontekst« nanaša na paket, ki zagotavlja funkcionalnost za vrednosti v obsegu zahteve in signale preklica čez meje API-ja.
Kontekstni paket deluje sočasno z modelom sočasnosti Go, ki temelji na konceptu goroutines. Goroutines so lahke izvedbene niti, ki jih lahko ustvarite in učinkovito upravljate, kar olajša ustvarjanje sočasnih programov v Go.
Kontekstni paket
Kontekstni paket nudi funkcionalnost za preklic dolgotrajnih funkcij ali celotnih klicnih verig. Paket pomaga tudi pri shranjevanju vrednosti v obsegu zahteve za dostop kjer koli znotraj klicne verige. Ta funkcija je priročna pri delu z API-ji ali mikrostoritve, kjer lahko zahteve obsegajo več funkcijskih klicev in jih želite preklicati ali jim pripeti določene vrednosti.
Evo, kako lahko uvozite kontekstni paket v svoj Go programi.
uvoz"kontekst"
Kontekstne funkcije upoštevajo Kontekst tip strukture kontekstnega paketa. Običajno bi morali uporabiti ctx kot ime spremenljivke primerka.
funkoperacije(kontekst ctx. kontekst) {
}
Funkcije lahko vrnejo vrsto strukture konteksta za druge funkcije in operacije.
funkoperacije(kontekst ctx. kontekst)kontekstu.Kontekst {
}
Nov kontekst lahko ustvarite z NAREDITI funkcijo kontekstnega paketa. Funkcija TODO ustvari nov kontekst z vrednostjo kontekstu. Končano(), kanal, ki se zapre ob preklicu konteksta. Uporabite ga kot ogrado, ko potrebujete kontekst, vendar noben nadrejeni kontekst ni primeren.
uvoz"kontekst"
funkglavni() {
ctx := kontekst. NAREDITI()
}
Druga možnost je, Ozadje funkcija ustvari nov kontekst brez vrednosti in prazen kanal Končano.
ctx := kontekst. Ozadje()
Funkcijo Background bi morali uporabiti kot koren kontekstnega drevesa.
Kontekst z vrednotami
Kontekstni paket zagotavlja funkcionalnost za širjenje vrednosti in signalov preklica. Vrednosti lahko uporabite za informacije od podatkov v obsegu zahteve do signalov za preklic in rokov.
Kontekstni paket omogoča tudi ustvarjanje podrejenega konteksta, podedovanega od nadrejenih kontekstov, kar omogoča učinkovito obravnavanje vrednosti in signalov preklica v celotnem programu, saj lahko kontekst posredujete skozi več funkcije.
Tukaj je primer posredovanja konteksta skozi funkcije s kontekstnim paketom.
uvoz (
"kontekst"
)funkvaluableContext(kontekst ctx. kontekst)kontekstu.Kontekst {
vrnitev kontekstu. WithValue (ctx, "geslo", "hfouneqcelkwfu")
}
funkreceiveContextData(kontekst ctx. kontekst)kaj {
geslo := ctx. Vrednost ("geslo")
vrnitev geslo
}
The valuableContext funkcija sprejme primerek konteksta in vrne primerek konteksta za naslednjo funkcijo. Primerek konteksta je vrednost, ustvarjena z WithValue metoda. Metoda WithValue vzame primerek konteksta iz funkcije in para ključ-vrednost.
Če želite pridobiti podatke iz konteksta, boste morali ustvariti nov kontekst z NAREDITI oz Ozadje funkcijo in posreduje kontekst funkciji (v tem primeru valuableContext) in prejme kontekst z receiveContextData funkcijo.
funkglavni() {
ctx := kontekst. Ozadje()
ctx = valuableContext (ctx)
fmt. Println (receiveContextData (ctx))
}
Spremenljivka ctx je primerek konteksta iz funkcije Background. Funkcija valuableContext sprejme spremenljivko ctx in vrne kontekst z vrednostjo, ki jo sprejme funkcija receiveContextData in vrne vrednost iz para ključ-vrednost.
Kontekstne časovne omejitve in roki
The kontekstu paket ponuja funkcionalnost za nastavitev časovnih omejitev in rokov v operacijah. Nastavitev časovnih omejitev in rokov je koristna za operacije, ki jih je treba nadoknaditi.
Časovne omejitve so čas, ki ga traja operacija. Za operacijo lahko nastavite časovno omejitev, ki traja 4 sekunde; po tem kontekst prekliče zahtevo.
Po drugi strani pa rok določa absolutno točko, ko naj se operacija prekine.
Lahko uporabite WithTimeout metoda za nastavitev časovne omejitve konteksta. Takole lahko nastavite 2-sekundno časovno omejitev.
funkglavni() {
ctx, prekliči := kontekst. WithTimeout (kontekst. Ozadje(), 2 * čas. drugič)
odložiti prekliči ()
// neka operacija
}
The glavni funkcija ustvari kontekst s časovno omejitvijo dveh sekund. Funkcija WithTimeout vrne funkcijo preklica, ki jo lahko odložite za preklic ob izhodu iz glavne funkcije.
Roke lahko prijavite z WithDeadline metoda. Metoda WithDeadline upošteva primer konteksta in rok.
funknaredi kaj(kontekst ctx. kontekst) {
deadlineTime := čas. Zdaj().Dodaj(1500 * čas. milisekunda)
ctx, ctxCancel := kontekst. WithDeadline (ctx, deadlineTime)
odložiti ctxCancel()// neka operacija
ctxCancel()
}
The naredi kaj funkcija zavzame kontekst in deadlineTime spremenljivka je čas pred kontekstu rok. The ctx spremenljivka je kontekst z rokom.
The ctxCancel spremenljivka prekliče kontekst, ko kontekst preseže svoj rok.
Najboljše prakse za uporabo kontekstov v Go
Izogibajte se uporabi kontekstov kot globalnih spremenljivk. Uporaba kontekstov kot globalnih spremenljivk lahko povzroči nepričakovano vedenje kode in napake, ki jih je težko izslediti, zato uporabite kontekst zmerno, da zmanjšate zapletenost kode.
Končno, uporabite kontekste kot signale, ne kot jamstva. Preklic konteksta ne zagotavlja, da se bodo vsi goroutini prenehali izvajati; to je zgolj signal, goroutine pa so agnostične glede kontekstov.