Junior — Middle
Kas nutinka, jei bandote skaityti duomenis iš kanalo, kuris šiuo metu nebeturi elementų?
sobes.tech AI
Atsakymas iš AI
Go kalboje, jei bandote skaityti iš kanalo, kuris šiuo metu neapima elementų, elgsena priklauso nuo kanalo tipo:
- Būseninis kanalas: jei buferis tuščias, skaitymas blokuojasi, kol į kanalą nebus įrašytas elementas.
- Be buferio kanalas: skaitymas blokuojasi, kol kita gorutina neatsiųs reikšmės.
Todėl, skaitymas iš tuščio kanalo sukelia dabartinės gorutinos blokavimą iki duomenų atsiradimo arba kanalo uždarymo.
Pavyzdys:
ch := make(chan int)
// Skaitymas iš tuščio kanalo užblokuos vykdymą
val := <-ch // užblokuojama, kol kas nors neatsiųs reikšmės
// Norint išvengti blokavimo, galima naudoti select su default
select {
case val := <-ch:
fmt.Println("Gauta", val)
default:
fmt.Println("Duomenų nėra kanale")
}