Sobes.tech
Junior — Middle

Czy możliwa jest operacja odczytu z kanału bez użycia bufora?

sobes.tech AI

Odpowiedź od AI

W Go operacja odczytu z kanału (chan) bez użycia bufora jest możliwa tylko wtedy, gdy kanał jest z buforem. Jeśli kanał nie ma bufora (rozmiar 0), operacja odczytu blokuje się do momentu, gdy do kanału zostanie wysłana wartość.

Zatem:

  • Aby odczyt nieblokujący bez bufora był możliwy, należy używać operacji nieblokujących z kanałem (np. przez select z default), ale to nie gwarantuje otrzymania danych.
  • Jeśli kanał nie ma bufora, odczyt zawsze się blokuje, dopóki ktoś nie wyśle danych.

Przykład kanału z buforem:

ch := make(chan int, 1) // bufor na 1 element
ch <- 42                // wysyłamy wartość
val := <-ch             // odczyt bez blokady

Jeśli kanał nie ma bufora, odczyt i zapis synchronizują się bezpośrednio między gorutynami.