0Pricing
Go Academy · Lekcja

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.

Wszystkie lekcje w tym kursie

  1. Instrukcja select
  2. Limity czasu i tickery
  3. Wzorce fan-in i fan-out
  4. Wzorzec puli pracowników
← Powrót do Go Academy