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-teldefault-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.