Pakiet Go Context

Większość programistów Go używa context.Context, nie rozumiejąc go w pełni. Można go spotkać w handlerach HTTP, wywołaniach baz danych i metodach SDK. Wielu początkujących przekazuje context.Background() wszędzie.

Ten błąd powoduje problemy. Funkcja Lambda może zawisnąć po przekroczeniu czasu oczekiwania (timeout). Zapytanie do bazy danych może kontynuować działanie po rozłączeniu się użytkownika.

Context pozwala na przesyłanie sygnałów anulowania oraz terminów (deadlines) wewnątrz kodu. Pomaga odpowiedzieć na trzy pytania:

• Czy ta operacja powinna kontynuować działanie? • Kiedy ta operacja musi się zakończyć? • Jakie dane żądania przepływają wraz z tym wywołaniem?

Interfejs Context posiada cztery metody:

Context działa jak drzewo. Zaczynasz od kontekstu nadrzędnego (parent) i tworzysz konteksty potomne (children).

Konteksty główne (Root Contexts):

Konteksty potomne (Child Contexts):

Kluczowa zasada: Zawsze wywołuj funkcję cancel. Użyj defer cancel() natychmiast po utworzeniu kontekstu potomnego. Jeśli o tym zapomnisz, spowodujesz wycieki pamięci.

Dobre praktyki:

Gdy kontekst nadrzędny zostaje anulowany, wszystkie jego konteksty potomne są anulowane automatycznie. Ułatwia to zatrzymanie całego łańcucha operacji w całym systemie.

Źródło: https://dev.to/ferztyle/go-context-package-37nk