Sobes.tech
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 select s default), 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.