Junior — Middle
Kas kanalilt lugemise operatsioon on võimalik ilma vahemäluta?
sobes.tech AI
Vastus AI-lt
Go keeles on kanali (chan) lugemise operatsioon ilma buferita võimalik ainult siis, kui kanal on buferiga. Kui kanalil pole buferit (suurus 0), siis lugemise operatsioon blokeerub kuni väärtus saadetakse kanalile.
Seega:
- Buferita, mitte-blokeeriva lugemise jaoks, tuleb kasutada mitte-blokeerivaid operatsioone kanali abil (näiteks
select-i kaududefault-iga), kuid see ei taga andmete saamist. - Kui kanalil pole buferit, blokeerub lugemine alati kuni keegi saadab andmed.
Näide buferiga kanalist:
ch := make(chan int, 1) // bufer 1 elemendile
ch <- 42 // väärtuse saatmine
val := <-ch // ilma blokeerimiseta lugemine
Kui kanalil pole buferit, sünkroniseeruvad lugemine ja kirjutamine otse goroutine'ide vahel.