Instrukcja select
Multipleksowanie kanałów za pomocą select
Instrukcja select 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.
Czym jest select?
Instrukcja select pozwala gorutynie jednocześnie oczekiwać na wiele operacji na kanałach. Wybiera pierwszy przypadek gotowy do wykonania, podobnie jak switch, ale dla kanałów.
Podstawowa składnia
Każdy case w instrukcji select oznacza wysłanie do kanału albo odebranie z kanału:
select {
case msg := <-ch1:
fmt.Println("ch1:", msg)
case msg := <-ch2:
fmt.Println("ch2:", msg)
}Nieblokująca operacja z default
Dodanie przypadku default sprawia, że instrukcja select nie blokuje — jeśli żaden kanał nie jest gotowy, wykonanie natychmiast przechodzi do default.
select {
case v := <-ch:
fmt.Println(v)
default:
fmt.Println("no value ready")
}Losowy wybór
Gdy kilka przypadków jest gotowych w tym samym czasie, Go wybiera jeden losowo — każdy gotowy przypadek ma jednakową szansę wyboru. Zapobiega to zagłodzeniu.
Wysyłanie w select
Przypadki mogą również oznaczać wysyłanie do kanału. Przypadek wysyłania jest gotowy, gdy kanał ma wolne miejsce w buforze (lub gdy oczekuje odbiorca).
select {
case ch1 <- val1:
fmt.Println("sent to ch1")
case ch2 <- val2:
fmt.Println("sent to ch2")
}Pusty select blokuje na zawsze
Samotna instrukcja select{} bez przypadków blokuje bieżącą gorutynę na zawsze. Jest to często stosowany idiom pozwalający utrzymać główną gorutynę przy życiu podczas działania innych gorutyn.
func main() {
go serve()
select {} // block forever
}Pętla z select
Umieszczenie select wewnątrz pętli for pozwala stale multipleksować kanały. Należy dodać kanał done, aby prawidłowo zakończyć pętlę.
for {
select {
case v := <-data:
process(v)
case <-done:
return
}
}Kanały nil
Kanał nil blokuje przypadek select na zawsze, skutecznie go wyłączając. Można użyć tej właściwości do dynamicznego włączania i wyłączania przypadków w czasie działania programu.
var ch chan int // nil
select {
case v := <-ch: // never selected
_ = v
case v := <-other:
fmt.Println(v)
}Select z zamkniętymi kanałami
Odczyt z zamkniętego kanału zawsze kończy się natychmiast powodzeniem i zwraca wartość zerową. Należy użyć formy z dwiema wartościami, aby wykryć zamknięcie kanału.
select {
case v, ok := <-ch:
if !ok { return } // channel closed
use(v)
}Wzorce priorytetów
Instrukcja select w Go natywnie nie obsługuje priorytetów. Aby nadać priorytet jednemu kanałowi, należy zagnieździć instrukcje select albo użyć pętli, która najpierw sprawdza kanał o wysokim priorytecie za pomocą default.
for {
select {
case v := <-highPriority:
handle(v)
default:
select {
case v := <-lowPriority:
handle(v)
}
}
}Dotychczasowe podsumowanie
select oczekuje na wiele kanałów, wybiera losowy gotowy przypadek, obsługuje default w trybie nieblokującym, a kanały nil wyłączają przypadki. Typowy wzorzec: for+select+done.
Szybkie sprawdzenie
Co się dzieje, gdy kilka przypadków w instrukcji select jest gotowych w tym samym czasie?
Podsumowanie: instrukcja select
Najważniejsze informacje:
- select blokuje wykonanie do momentu, gdy jeden z przypadków kanałowych będzie gotowy
- Wiele gotowych przypadków → losowy wybór
- default sprawia, że instrukcja nie blokuje
- kanał nil wyłącza swój przypadek
- for+select+done to standardowa pętla do multipleksowania kanałów
Często zadawane pytania
Czy lekcja „Instrukcja select” jest bezpłatna?
Tak — pełny tekst „Instrukcja select” 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 „Instrukcja select”?
Multipleksowanie kanałów za pomocą select Ć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 „Instrukcja select”?
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.