Kontekstas yra viena iš svarbiausių „Go“ funkcijų, leidžiančių vienu metu. Programoje „Go“ „kontekstas“ reiškia paketą, teikiantį užklausos apimties verčių ir atšaukimo signalų funkcijas per API ribas.
Konteksto paketas veikia kartu su „Go“ lygiagretumo modeliu, paremtu gorutinų koncepcija. „Goroutines“ yra lengvos vykdymo gijos, kurias galite kurti ir efektyviai valdyti, todėl „Go“ lengva kurti lygiagrečias programas.
Konteksto paketas
Kontekstinis paketas suteikia galimybę atšaukti ilgai veikiančias funkcijas arba visas skambučių grandines. Paketas taip pat padeda išsaugoti užklausos apimties reikšmes, kad būtų galima pasiekti bet kurioje skambučių grandinės vietoje. Ši funkcija yra patogi dirbant su API arba mikropaslaugos, kur užklausos gali apimti kelis funkcijų iškvietimus ir norite jas atšaukti arba pridėti konkrečias reikšmes.
Štai kaip galite importuoti kontekstinį paketą į savo Eikite į programas.
importuoti"kontekstas"
Kontekstinės funkcijos perima Kontekstas kontekstinio paketo struct tipą. Tradiciškai turėtumėte naudoti ctx kaip egzemplioriaus kintamojo pavadinimas.
funcoperacijos(ctx kontekstas. kontekstas) {
}
Funkcijos gali grąžinti Konteksto struktūros tipą kitoms funkcijoms ir operacijoms.
funcoperacijos(ctx kontekstas. kontekstas)kontekste.Kontekstas {
}
Galite sukurti naują kontekstą naudodami DARYTI kontekstinio paketo funkcija. Funkcija TODO sukuria naują kontekstą su verte kontekste. Padaryta(), kanalas, kuris bus uždarytas atšaukus kontekstą. Turėtumėte naudoti jį kaip rezervuotąją vietą, kai jums reikia konteksto, bet jokie pirminiai kontekstai netinka.
importuoti"kontekstas"
funcpagrindinis() {
ctx := kontekstas. DARYTI()
}
Arba, Fonas funkcija sukuria naują kontekstą be reikšmės ir tuščią Done kanalą.
ctx := kontekstas. Fonas ()
Funkciją Fonas turėtumėte naudoti kaip kontekstinio medžio šaknį.
Kontekstas su vertybėmis
Kontekstinis paketas suteikia reikšmių ir atšaukimo signalų platinimo funkciją. Vertes galite naudoti informacijai nuo užklausos apimties duomenų iki atšaukimo signalų ir terminų.
Konteksto paketas taip pat leidžia sukurti vaikų kontekstą, paveldėtą iš tėvų kontekstų, todėl tai leidžia efektyviai reikšmių ir atšaukimo signalų tvarkymas visoje programoje, nes kontekstą galite perduoti per kelis funkcijas.
Čia pateikiamas konteksto perdavimo per funkcijas naudojant konteksto paketą pavyzdys.
importuoti (
"kontekstas"
)funcvertingasKontekstas(ctx kontekstas. kontekstas)kontekste.Kontekstas {
grąžinti kontekste. WithValue (ctx, "slaptažodis", "hfouneqcelkwfu")
}
funcgautiContextData(ctx kontekstas. kontekstas)bet koks {
passKey := ctx. Reikšmė("slaptažodis")
grąžinti prieigos raktas
}
The vertingasKontekstas funkcija paima kontekstinį egzempliorių ir grąžina šios funkcijos kontekstinį egzempliorių. Konteksto pavyzdys yra vertė, sukurta naudojant Su Vertė metodas. Metodas WithValue kontekstinį egzempliorių paima iš funkcijos ir rakto-reikšmių poros.
Norėdami gauti duomenis iš konteksto, turėsite sukurti naują kontekstą naudodami DARYTI arba Fonas funkcija ir perduokite kontekstą funkcijai (šiuo atveju vertingaContext) ir gaukite kontekstą su gautiContextData funkcija.
funcpagrindinis() {
ctx := kontekstas. Fonas ()
ctx = vertingas kontekstas (ctx)
fmt. Println (gautiContextData (ctx))
}
Ctx kintamasis yra fono funkcijos kontekstinis pavyzdys. Funkcija valueContext paima ctx kintamąjį ir grąžina kontekstą su reikšme, kurią gauna funkcija ReceiveContextData, ir grąžina reikšmę iš rakto-reikšmių poros.
Kontekstinis laikas ir terminai
The kontekste paketas suteikia funkcionalumą, leidžiantį nustatyti operacijų laiką ir terminus. Laiko ir terminų nustatymas yra naudingas atliekant operacijas, kurias reikia pasivyti.
Laikas yra laikas, per kurį atliekama operacija. Galite nustatyti, kad operacija truktų 4 sekundes; po to kontekstas prašymą atšaukia.
Kita vertus, terminas apibrėžia absoliutų tašką, kai operacija turi būti atšaukta.
Galite naudoti Su Timeout būdas nustatyti kontekstinį skirtąjį laiką. Štai kaip galite nustatyti 2 sekundžių skirtąjį laiką.
funcpagrindinis() {
ctx, atšaukti := kontekstą. WithTimeout (kontekstas. Fonas (), 2 * laikas. Antra)
atidėti atšaukti ()
// kažkokia operacija
}
The pagrindinis funkcija sukuria kontekstą su dviejų sekundžių skirtuoju laiku. Funkcija WithTimeout grąžina atšaukimo funkciją, kurią galite atidėti išėjus iš pagrindinės funkcijos.
Galite deklaruoti terminus su Su terminu metodas. „WithDeadline“ metodas apima kontekstinį pavyzdį ir termino laiką.
funcpadaryti ką nors(ctx kontekstas. kontekstas) {
deadlineTime := laikas. Dabar().Pridėti(1500 * laikas. Milisekundė)
ctx, ctxCancel := kontekstas. WithDeadline (ctx, deadlineTime)
atidėti ctxCancel()// kažkokia operacija
ctxCancel()
}
The padaryti ką nors funkcija užima kontekstą ir terminasLaikas kintamasis yra laikas prieš kontekste terminas. The ctx kintamasis yra kontekstas su terminu.
The ctxAtšaukti kintamasis atšaukia kontekstą, kai kontekstas viršija terminą.
Geriausia kontekstų naudojimo „Go“ praktika
Nenaudokite kontekstų kaip visuotinių kintamųjų. Kontekstų naudojimas kaip pasauliniai kintamieji gali sukelti netikėtą kodo elgesį ir sunkiai atsekamas klaidas, o kontekstą naudoti taupiai, kad sumažintumėte kodo sudėtingumą.
Galiausiai naudokite kontekstus kaip signalus, o ne garantijas. Konteksto atšaukimas negarantuoja, kad visos gorutinos nustos veikti; tai tik signalas, o gorutinos yra kontekstų agnostikas.