Čitatelia ako vy pomáhajú podporovať MUO. Keď uskutočníte nákup pomocou odkazov na našej stránke, môžeme získať pridruženú províziu. Čítaj viac.

Kontext je jednou z kritických funkcií v Go, ktorá umožňuje súbežnosť. V Go „kontext“ označuje balík, ktorý poskytuje funkcie pre hodnoty v rozsahu požiadaviek a signály zrušenia cez hranice API.

Kontextový balík funguje súčasne s modelom súbežnosti Go, ktorý je založený na koncepte gorutín. Goroutines sú ľahké vlákna vykonávania, ktoré môžete vytvárať a efektívne spravovať, vďaka čomu je jednoduché vytvárať súbežné programy v Go.

Kontextový balík

Kontextový balík poskytuje funkcie na zrušenie dlho spustených funkcií alebo celých reťazcov hovorov. Balík tiež pomáha s ukladaním hodnôt v rozsahu požiadaviek pre prístup kdekoľvek v rámci reťazca hovorov. Táto funkcia je užitočná pri práci s API alebo mikroslužby, kde požiadavky môžu zahŕňať viacero funkčných volaní a vy ich chcete zrušiť alebo k nim pripojiť konkrétne hodnoty.

Tu je návod, ako môžete importovať kontextový balík do svojho Choďte na programy.

instagram viewer
importovať"kontext"

Kontextové funkcie prijímajú Kontext typ štruktúry kontextového balíka. Konvenčne by ste mali použiť ctx ako názov premennej inštancie.

funcoperácií(kontext ctx. Kontext) {
}

Funkcie môžu vrátiť typ štruktúry Kontext pre iné funkcie a operácie.

funcoperácií(kontext ctx. Kontext)kontext.Kontext {
}

Môžete vytvoriť nový kontext pomocou ROBIŤ funkcie kontextového balíka. Funkcia TODO vytvorí nový kontext s hodnotou kontext. Hotový(), kanál, ktorý sa zatvorí pri zrušení kontextu. Mali by ste ho použiť ako zástupný symbol, keď potrebujete kontext, ale nie sú vhodné žiadne nadradené kontexty.

importovať"kontext"

funcHlavná() {
ctx := kontext. ROBIŤ()
}

Prípadne, Pozadie vytvorí nový kontext bez hodnoty a s prázdnym kanálom Hotovo.

ctx := kontext. Pozadie()

Ako koreň kontextového stromu by ste mali použiť funkciu Pozadie.

Kontext s hodnotami

Kontextový balík poskytuje funkcie na šírenie hodnôt a signály zrušenia. Hodnoty môžete použiť na informácie od údajov v rozsahu požiadaviek až po signály zrušenia a termíny.

Kontextový balík tiež umožňuje vytvorenie podradeného kontextu zdedeného z nadradených kontextov, čo umožňuje efektívnosť manipuláciu s hodnotami a signálmi zrušenia v rámci programu, pretože kontext môžete prejsť viacerými funkcie.

Tu je príklad odovzdávania kontextu cez funkcie pomocou kontextového balíka.

importovať (
"kontext"
)

funchodnotný kontext(kontext ctx. Kontext)kontext.Kontext {
vrátiť kontext. WithValue (ctx, "prístupový kľúč", "hfouneqcelkwfu")
}

funcprijímaťContextData(kontext ctx. Kontext)akýkoľvek {
prístupový kľúč := ctx. Hodnota("prístupový kľúč")
vrátiť prístupový kľúč
}

The hodnotný kontext funkcia preberá kontextovú inštanciu a vracia kontextovú inštanciu pre nasledujúcu funkciu. Inštancia kontextu je hodnota vytvorená pomocou WithValue metóda. Metóda WithValue berie inštanciu kontextu z funkcie a páru kľúč – hodnota.

Ak chcete získať údaje z kontextu, budete musieť vytvoriť nový kontext s ROBIŤ alebo Pozadie funkcie a odovzdať kontext funkcii (v tomto prípade hodnotný kontext) a získať kontext s prijímaťContextData funkciu.

funcHlavná() {
ctx := kontext. Pozadie()
ctx = hodnotný kontext (ctx)
fmt. Println (receiveContextData (ctx))

}

Premenná ctx je inštanciou kontextu z funkcie Background. Funkcia hodnotnýContext preberá premennú ctx a vracia kontext s hodnotou, ktorú preberá funkcia acceptContextData a vracia hodnotu z páru kľúč – hodnota.

Kontextové časové limity a termíny

The kontext balík poskytuje funkcionalitu pre nastavenie timeoutov a termínov v operáciách. Nastavenie časových limitov a termínov je užitočné pre operácie, ktoré potrebujú dobehnúť.

Časové limity predstavujú trvanie operácie. Časový limit operácie môžete nastaviť na 4 sekundy; potom kontext zruší požiadavku.

Na druhej strane konečný termín definuje absolútny bod, kedy by sa operácia mala zrušiť.

Môžete použiť S časovým limitom metóda na nastavenie časového limitu kontextu. Tu je návod, ako môžete nastaviť 2-sekundový časový limit.

funcHlavná() {
ctx, zrušiť := kontext. WithTimeout (kontext. Pozadie(), 2 *čas. druhý)
odložiť Zrušiť()

// nejaká operácia
}

The Hlavná vytvorí kontext s časovým limitom dvoch sekúnd. Funkcia WithTimeout vracia funkciu zrušenia, ktorú môžete odložiť na zrušenie pri ukončení hlavnej funkcie.

Termíny môžete vyhlásiť pomocou S termínom metóda. Metóda WithDeadline zahŕňa kontextovú inštanciu a čas uzávierky.

funcurob niečo(kontext ctx. Kontext) {
deadlineTime := time. Teraz().Pridaj(1500 *čas. milisekúnd)
ctx, ctxCancel := kontext. WithDeadline (ctx, deadlineTime)
odložiť ctxCancel()

// nejaká operácia

ctxCancel()
}

The urob niečo funkcia berie do kontextu a deadlineTime premenná je čas pred kontext Konečný termín. The ctx premenná je kontext s termínom.

The ctxCancel premenná zruší kontext, keď kontext prekročí svoj konečný termín.

Osvedčené postupy na používanie kontextov v službe Go

Vyhnite sa používaniu kontextov ako globálnych premenných. Používanie kontextov ako globálnych premenných môže viesť k neočakávanému správaniu kódu a ťažko vysledovateľným chybám a kontext používajte šetrne na zníženie zložitosti kódu.

Nakoniec použite kontexty ako signály, nie záruky. Zrušenie kontextu nezaručuje, že sa prestanú spúšťať všetky goroutiny; je to len signál a goroutiny sú agnostické voči kontextom.