Čtenáři jako vy pomáhají podporovat MUO. Když provedete nákup pomocí odkazů na našich stránkách, můžeme získat provizi přidružené společnosti. Přečtěte si více.

Kontext je jednou z kritických funkcí v Go, která umožňuje souběžnost. V Go znamená „kontext“ balíček, který poskytuje funkce pro hodnoty v rozsahu požadavků a signály zrušení přes hranice rozhraní API.

Kontextový balíček funguje současně s modelem souběžnosti Go, který je založen na konceptu goroutin. Goroutines jsou jednoduchá vlákna spouštění, která můžete vytvářet a efektivně spravovat, což usnadňuje vytváření souběžných programů v Go.

Kontextový balíček

Kontextový balíček poskytuje funkce pro zrušení dlouho běžících funkcí nebo celých řetězců volání. Balíček také pomáhá s ukládáním hodnot v rozsahu požadavků pro přístup kdekoli v řetězci volání. Tato funkce je užitečná při práci s API nebo mikroslužby, kde požadavky mohou zahrnovat více volání funkcí a vy je chcete zrušit nebo k nim připojit konkrétní hodnoty.

Zde je návod, jak importovat kontextový balíček do vašeho Přejít na programy.

instagram viewer
import"kontext"

Kontextové funkce berou v Kontext struct typ kontextového balíčku. Obvykle byste měli používat ctx jako název proměnné instance.

funcoperace(kontext ctx. Kontext) {
}

Funkce mohou vrátit typ struktury Context pro další funkce a operace.

funcoperace(kontext ctx. Kontext)kontext.Kontext {
}

Můžete vytvořit nový kontext pomocí DĚLAT funkce kontextového balíčku. Funkce TODO vytvoří nový kontext s hodnotou kontext. Hotovo(), kanál, který se zavře při zrušení kontextu. Měli byste jej použít jako zástupný symbol, když potřebujete kontext, ale žádné nadřazené kontexty nejsou vhodné.

import"kontext"

funchlavní() {
ctx := kontext. DĚLAT()
}

Případně Pozadí funkce vytvoří nový kontext bez hodnoty a prázdný kanál Hotovo.

ctx := kontext. Pozadí()

Jako kořen kontextového stromu byste měli použít funkci Pozadí.

Kontext s hodnotami

Kontextový balíček poskytuje funkce pro šíření hodnot a signály zrušení. Hodnoty můžete použít pro informace od dat v rozsahu požadavků až po signály zrušení a termíny.

Kontextový balíček také umožňuje vytvoření podřízeného kontextu zděděného z nadřazených kontextů, což umožňuje efektivní zpracování hodnot a signálů zrušení v rámci programu, protože kontext můžete předat více funkcí.

Zde je příklad předávání kontextu prostřednictvím funkcí pomocí balíčku context.

import (
"kontext"
)

funchodnotný kontext(kontext ctx. Kontext)kontext.Kontext {
vrátit se kontext. WithValue (ctx, "přístupový klíč", "hfouneqcelkwfu")
}

funcpřijímatContextData(kontext ctx. Kontext)žádný {
passKey:= ctx. Hodnota("přístupový klíč")
vrátit se přístupový klíč
}

The hodnotný kontext funkce převezme instanci kontextu a vrátí instanci kontextu pro následující funkci. Instance kontextu je hodnota vytvořená pomocí WithValue metoda. Metoda WithValue přebírá instanci kontextu z funkce a páru klíč–hodnota.

Chcete-li načíst data z kontextu, budete muset vytvořit nový kontext s DĚLAT nebo Pozadí funkce a předá kontext funkci (v tomto případě valueContext) a přijme kontext s přijímatContextData funkce.

funchlavní() {
ctx := kontext. Pozadí()
ctx = hodnotný kontext (ctx)
fmt. Println (receiveContextData (ctx))

}

Proměnná ctx je instancí kontextu z funkce pozadí. Funkce valueContext přebírá proměnnou ctx a vrací kontext s hodnotou, kterou přebírá funkce acceptContextData, a vrací hodnotu z páru klíč–hodnota.

Kontextové časové limity a termíny

The kontext balíček poskytuje funkcionalitu pro nastavení timeoutů a termínů v operacích. Nastavení časových limitů a termínů je užitečné pro operace, které je třeba dohnat.

Časové limity představují dobu trvání operace. Můžete nastavit časový limit pro operaci na 4 sekundy; poté kontext zruší požadavek.

Na druhé straně termín definuje absolutní bod, kdy by se operace měla zrušit.

Můžete použít S časovým limitem metoda pro nastavení časového limitu kontextu. Zde je návod, jak můžete nastavit 2sekundový časový limit.

funchlavní() {
ctx, cancel := kontext. WithTimeout (kontext. Pozadí(), 2 * čas. Druhý)
odložit zrušení()

// nějaká operace
}

The hlavní funkce vytvoří kontext s časovým limitem dvou sekund. Funkce WithTimeout vrací funkci zrušení, kterou můžete odložit pro zrušení při ukončení hlavní funkce.

Termíny můžete deklarovat pomocí S termínem metoda. Metoda WithDeadline bere kontextovou instanci a čas uzávěrky.

funcdělej něco(kontext ctx. Kontext) {
deadlineTime := čas. Nyní().Přidat(1500 * čas. milisekundy)
ctx, ctxCancel := kontext. WithDeadline (ctx, deadlineTime)
odložit ctxCancel()

// nějaká operace

ctxCancel()
}

The dělej něco funkce bere v kontextu, a deadlineTime proměnná je čas před kontext Uzávěrka. The ctx proměnná je kontext s termínem.

The ctxCancel proměnná zruší kontext, když kontext překročí svůj termín.

Nejlepší postupy pro používání kontextů v Go

Nepoužívejte kontexty jako globální proměnné. Použití kontextů jako globálních proměnných může vést k neočekávanému chování kódu a obtížně dohledatelným chybám a kontext používejte šetrně ke snížení složitosti kódu.

Konečně používejte kontexty jako signály, nikoli záruky. Zrušení kontextu nezaručuje, že všechny goroutiny přestanou běžet; je to pouze signál a goroutines jsou agnostické vůči kontextům.