Dlaczego istnieje context.Context
Anulowanie i zarządzanie cyklem życia żądania
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
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
- Dlaczego istnieje context.Context
- WithCancel i WithTimeout
- WithDeadline i WithValue
- Kontekst w wywołaniach HTTP i baz danych