Sobes.tech
Junior — Middle

Ar įmanoma atlikti skaitymo operaciją iš kanalo be buferio?

sobes.tech AI

Atsakymas iš AI

Go kalboje skaitymo operacija iš kanalo (chan) be buferio įmanoma tik tada, kai kanalas yra su buferiu. Jei kanalas neturi buferio (dydis 0), skaitymo operacija blokuojasi, kol į kanalą nebus išsiųsta reikšmė.

Todėl:

  • Norint atlikti neblokiruojantį skaitymą be buferio, reikia naudoti neblokiruojančias operacijas su kanalu (pavyzdžiui, per select su default), tačiau tai negarantuoja duomenų gavimo.
  • Jei kanalas neturi buferio, skaitymas visada blokuojasi, kol kas nors neatsiųs duomenų.

Pavyzdys su buferiu:

ch := make(chan int, 1) // buferis 1 elementui
ch <- 42                // siųsti reikšmę
val := <-ch             // skaityti be bloko

Jei kanalas neturi buferio, skaitymas ir rašymas tiesiogiai sinchronizuojasi tarp gorutinų.