A kontextus a Go egyik kritikus jellemzője, amely lehetővé teszi a párhuzamosságot. A Go alkalmazásban a „kontextus” egy olyan csomagra utal, amely az API határain átnyúló kérési hatókörű értékekhez és lemondási jelekhez nyújt funkcionalitást.
A kontextuscsomag egyidejűleg működik a Go párhuzamossági modelljével, amely a gorutinok koncepcióján alapul. A Goroutines könnyű végrehajtási szálak, amelyeket hatékonyan hozhat létre és kezelhet, megkönnyítve ezzel párhuzamos programok létrehozását a Go-ban.
A kontextus csomag
A környezeti csomag hosszú ideig futó függvények vagy teljes hívási láncok törlésére szolgál. A csomag segít a kérés-hatókörű értékek tárolásában is a hívási láncon belüli bárhol eléréshez. Ez a funkció hasznos, ha dolgozik vele API-k vagy mikroszolgáltatások, ahol a kérések több függvényhívásra is kiterjedhetnek, és törölni szeretné őket, vagy adott értékeket szeretne hozzájuk csatolni.
Így importálhatja a környezeti csomagot a sajátjába Menj programok.
import"kontextus"
A kontextusfüggvények a Kontextus a környezeti csomag struct típusa. Hagyományosan érdemes használni ctx mint a példányváltozó neve.
functevékenységek(ctx kontextus. Kontextus) {
}
A függvények visszaadhatják a Context struktúra típust más függvényekhez és műveletekhez.
functevékenységek(ctx kontextus. Kontextus)kontextus.Kontextus {
}
Új kontextust hozhat létre a CSINÁLNI a kontextuscsomag funkciója. A TODO függvény új kontextust hoz létre az értékkel kontextus. Kész(), egy csatorna, amely bezárul a kontextus megszüntetésével. Használja helyőrzőként, ha kontextusra van szüksége, de nem megfelelő szülő kontextus.
import"kontextus"
funcfő-() {
ctx := kontextus. CSINÁLNI()
}
Alternatív megoldásként a Háttér függvény új kontextust hoz létre érték nélkül és egy üres Done csatornát.
ctx := kontextus. Háttér()
Használja a Háttér függvényt a környezetfa gyökereként.
Kontextus értékekkel
A környezeti csomag funkcionalitást biztosít az értékek és a törlési jelek terjesztéséhez. Az értékeket információkhoz használhatja, a kérési hatókörű adatoktól a törlési jelzésekig és a határidőkig.
A kontextuscsomag lehetővé teszi a szülői kontextusokból örökölt gyermek kontextus létrehozását is, ami lehetővé teszi a hatékony működést az értékek és a törlési jelek kezelése egy programon belül, mivel a kontextust több helyen is átadhatja funkciókat.
Íme egy példa a kontextus függvényeken keresztül történő átadására a kontextuscsomaggal.
import (
"kontextus"
)funcértékesContext(ctx kontextus. Kontextus)kontextus.Kontextus {
Visszatérés kontextus. With Value (ctx, "jelszó", "hfouneqcelkwfu")
}
funcReceiveContextData(ctx kontextus. Kontextus)Bármi {
passKey := ctx. Érték("jelszó")
Visszatérés passKey
}
A értékesContext függvény egy kontextuspéldányt vesz fel, és egy kontextuspéldányt ad vissza a következő függvényhez. A kontextuspéldány egy érték, amelyet a With Value módszer. A WithValue metódus a kontextuspéldányt a függvényből és egy kulcs-érték párból veszi.
Az adatok kontextusból való lekéréséhez új kontextust kell létrehoznia a CSINÁLNI vagy Háttér függvényt, és adja át a kontextust a függvénynek (ebben az esetben a valueContext), és kapja meg a kontextust a ReceiveContextData funkció.
funcfő-() {
ctx := kontextus. Háttér()
ctx = értékesKontextus (ctx)
fmt. Println (ContextData fogadása (ctx))
}
A ctx változó a háttérfüggvény környezeti példánya. A valueContext függvény beveszi a ctx változót, és visszaadja a kontextust a ReceiveContextData függvény által felvett értékkel, és visszaadja a kulcs-érték pár értéket.
Kontextus Időtúllépések és határidők
A kontextus A csomag lehetővé teszi az időkorlátok és határidők beállítását a műveletekben. Az időkorlátok és határidők beállítása hasznos a felzárkózást igénylő műveleteknél.
Az időtúllépések a művelet időtartama. Beállíthat egy művelet időtúllépését 4 másodpercre; ezt követően a kontextus törli a kérést.
Másrészt a határidő meghatározza azt az abszolút pontot, ahol a műveletet meg kell szakítani.
Használhatja a Időtúllépéssel módszer a környezeti időtúllépés beállítására. Így állíthat be 2 másodperces időtúllépést.
funcfő-() {
ctx, cancel := kontextus. WithTimeout (kontextus. Háttér(), 2 * idő. Második)
elhalasztja megszünteti()
// valamilyen művelet
}
A fő- függvény kontextust hoz létre két másodperces időtúllépéssel. A WithTimeout függvény egy törlési függvényt ad vissza, amelyet a fő függvényből való kilépéskor elhalaszthat.
Határidőket nyilatkozni a Határidővel módszer. A WithDeadline metódus egy kontextuspéldányt és egy határidőt vesz igénybe.
funccsinálj valamit(ctx kontextus. Kontextus) {
deadlineTime := idő. Now().Add(1500 * idő. Miliszekundum)
ctx, ctxCancel := kontextus. WithDeadline (ctx, deadlineTime)
elhalasztja ctxCancel()// valamilyen művelet
ctxCancel()
}
A csinálj valamit függvény kontextusba kerül, és a határidőTime változó az előtti idő kontextus határidő. A ctx változó a kontextus egy határidővel.
A ctxMégse változó törli a kontextust, ha a kontextus túllépi a határidőt.
Bevált gyakorlatok a kontextusok használatához a Go alkalmazásban
Kerülje a kontextusok globális változóként való használatát. A kontextusok globális változóként történő használata váratlan kódviselkedéshez és nehezen nyomon követhető hibákhoz vezethet, és takarékosan használja a környezetet a kód bonyolultságának csökkentése érdekében.
Végül a kontextusokat használja jelzésként, ne garanciaként. A kontextus törlése nem garantálja, hogy minden gorutin leáll; ez csupán egy jelzés, és a gorutinok nem ismerik az összefüggéseket.