Go Academy · Lekcja

Dlaczego istnieje context.Context

Anulowanie i zarządzanie cyklem życia żądania

Lekcja 1 z 413 kroki

Dlaczego istnieje context.Context to bezpłatna lekcja Go Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Go Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Go Academy zawiera 4 lekcji w sumie.

Problem

Bez mechanizmu anulowania trwających operacji powolne zapytanie do bazy danych lub wywołanie HTTP blokuje swoją gorutynę aż do zakończenia, marnując zasoby, gdy pierwotne żądanie zostało już porzucone.

Przegląd context.Context

context.Context to interfejs, który przenosi sygnał anulowania, opcjonalny termin oraz metadane w postaci klucz-wartość przez granice interfejsów API i gorutyny.

type Context interface {
    Deadline() (deadline time.Time, ok bool)
    Done() <-chan struct{}
    Err() error
    Value(key any) any
}

Kanał Done

ctx.Done() zwraca kanał, który zostaje zamknięty po anulowaniu kontekstu lub przekroczeniu limitu czasu. Gorutyny używają go w instrukcji select, aby wykrywać anulowanie.

select {
case result := <-workCh:
    return result, nil
case <-ctx.Done():
    return nil, ctx.Err()
}

context.Background()

context.Background() to kontekst główny — nigdy nie jest anulowany, nie ma terminu ani wartości. Używaj go na początku obsługi żądania, w main lub w testach.

context.TODO()

context.TODO() to również nieanulowalny kontekst główny, używany jako symbol zastępczy, gdy właściwy kontekst nie jest jeszcze dostępny. Sygnalizuje on zamiar osobom przeglądającym kod.

Dlaczego przekazywać Context jako pierwszy argument?

Zgodnie z konwencją pierwszym parametrem każdej funkcji, którą można anulować, jest ctx context.Context. Dzięki temu anulowanie jest jawne i łatwe do wykrycia w interfejsach API.

func FetchUser(ctx context.Context, id int) (*User, error) {
    return db.QueryContext(ctx, "SELECT ...", id)
}

Anulowanie jest propagowane

Anulowanie kontekstu nadrzędnego anuluje wszystkie wyprowadzone z niego konteksty podrzędne. Dzięki temu pojedyncze wywołanie anulowania może zatrzymać całe drzewo gorutyn i operacji.

Czym Context nie jest

Context nie jest uniwersalnym pojemnikiem na wartości — używaj go wyłącznie dla danych związanych z żądaniem, takich jak identyfikatory śledzenia lub tokeny uwierzytelniania, a nie dla parametrów opcjonalnych. Wartości przechowuj w typowanych strukturach.

Integracja ze standardową biblioteką

Klient HTTP, sterownik SQL, gRPC ze standardowej biblioteki oraz wiele pakietów innych firm przyjmują Context, umożliwiając propagowanie anulowania przez cały stos wywołań.

Przechowywanie Context w strukturze

Nie przechowuj Context wewnątrz struktury. Przekazuj go jawnie jako argument funkcji. Przechowywanie go sprawia, że czas życia anulowania staje się niejasny i często prowadzi do błędów.

Context jest niezmienny

Context jest niezmienny — wyprowadzasz nowe konteksty, opakowując je za pomocą WithCancel, WithDeadline, WithTimeout lub WithValue. Kontekst nadrzędny pozostaje niezmieniony.

Szybki test

Co zwraca ctx.Done()?

Podsumowanie: context.Context

Najważniejsze informacje:

  • Przenosi anulowanie, termin i metadane między gorutynami
  • Przekazuj go jako pierwszy argument; nigdy nie przechowuj go w strukturach
  • Kanał ctx.Done() zostaje zamknięty po anulowaniu lub przekroczeniu limitu czasu
  • Anulowanie jest propagowane z kontekstu nadrzędnego do wszystkich podrzędnych
Bezpłatny start

Ucz się Go dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
51
Lekcje
203

Często zadawane pytania

Czy lekcja „Dlaczego istnieje context.Context” jest bezpłatna?

Tak — pełny tekst „Dlaczego istnieje context.Context” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Go Academy, przejdź na CoddyKit PRO. Kurs Go Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Dlaczego istnieje context.Context”?

Anulowanie i zarządzanie cyklem życia żądania Ćwiczysz Go Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Go Academy?

Nie wymagamy żadnego doświadczenia. Go Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.

Ile czasu zajmuje lekcja „Dlaczego istnieje context.Context”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Go Academy?

Tak. Każda lekcja Go Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Dlaczego istnieje context.Context
  2. WithCancel i WithTimeout
  3. WithDeadline i WithValue
  4. Kontekst w wywołaniach HTTP i baz danych
← Powrót do Go Academy