Sobes.tech
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 kaudu default-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.