Sobes.tech
Junior — Middle

Lehetséges-e olvasási művelet a csatornából buffer használata nélkül?

sobes.tech MI

Válasz az MI-től

Go-ban az üres csatornából (chan) történő olvasási művelet csak akkor lehetséges, ha a csatorna pufferelt. Ha a csatorna nem pufferelt (mérete 0), az olvasási művelet blokkolódik, amíg érték nem kerül küldésre a csatornára.

Tehát:

  • A puffer nélküli, nem blokkoló olvasáshoz nem-blokkoló műveleteket kell használni a csatornával (például select-tel default-dal), de ez nem garantálja az adatok fogadását.
  • Ha a csatorna nem pufferelt, az olvasás mindig blokkolódik, amíg valaki nem küld adatot.

Példa pufferelt csatornára:

ch := make(chan int, 1) // 1 elemű puffer
ch <- 42                // érték küldése
val := <-ch             // blokkolás nélküli olvasás

Ha a csatorna nem pufferelt, az olvasás és írás közvetlenül szinkronizálódik a goroutine-ok között.