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.
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.