Junior — Middle
Je možné vykonať operáciu čítania z kanála bez použitia vyrovnávacej pamäte?
sobes.tech AI
Odpoveď od AI
V Go je operácia čítania z kanála (chan) bez použitia vyrovnávacej pamäte možná iba v prípade, že kanál je s vyrovnávacou pamäťou. Ak kanál nemá vyrovnávaciu pamäť (veľkosť 0), operácia čítania sa zablokuje, kým sa do kanála nepošle hodnota.
Takže:
- Pre neblokujúce čítanie bez vyrovnávacej pamäti je potrebné použiť neblokujúce operácie s kanálom (napríklad cez
selectsdefault), ale to nezaručuje prijatie dát. - Ak kanál nemá vyrovnávaciu pamäť, čítanie sa vždy zablokuje, kým niekto nepošle dáta.
Príklad s vyrovnávacou pamäťou:
ch := make(chan int, 1) // vyrovnávacia pamäť na 1 prvok
ch <- 42 // odoslanie hodnoty
val := <-ch // čítanie bez blokovania
Ak kanál nemá vyrovnávaciu pamäť, synchronizujú sa priamo čítanie a zápis medzi gorutinami.