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
selectzdefault), 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.