Sobes.tech
Junior — Middle

Co się dzieje, jeśli spróbujesz odczytać dane z kanału, który w tym momencie nie zawiera elementów?

sobes.tech AI

Odpowiedź od AI

W Go, jeśli spróbujesz odczytać z kanału, który w danym momencie nie zawiera elementów, zachowanie zależy od typu kanału:

  • Kanał z buforem: jeśli bufor jest pusty, odczyt blokuje się, dopóki nie zostanie zapisany element.
  • Kanał bez bufora: odczyt blokuje się do momentu, aż inna gorutyna wyśle wartość.

W związku z tym odczyt z pustego kanału powoduje zablokowanie bieżącej gorutyny do momentu pojawienia się danych lub zamknięcia kanału.

Przykład:

ch := make(chan int)

// Odczyt z pustego kanału zablokuje wykonanie
val := <-ch // blokuje się, dopóki ktoś nie wyśle wartości

// Aby uniknąć blokady, można użyć select z default
select {
case val := <-ch:
    fmt.Println("Otrzymano", val)
default:
    fmt.Println("Brak danych w kanale")
}