Junior — Middle
Kokiais atvejais vyksta blokavimas dirbant su standartiniu duomenų perdavimo kanalu?
sobes.tech AI
Atsakymas iš AI
Go standartinis duomenų perdavimo kanalas blokuojamas šiais atvejais:
- Siunčiant reikšmę į kanalą (
chan <- value), jei kanalas neturi buferio arba buferis yra pilnas, siuntimo gorutina blokuojama iki tol, kol kitas srautas perskaitys reikšmę. - Skaitydama iš kanalo (
value := <- chan), jei kanalas yra tuščias, skaitymo gorutina blokuojama iki kol pasirodys duomenys.
Taip, blokavimas įvyksta bandant siųsti duomenis į pilną kanalą arba skaityti iš tuščio kanalo, užtikrinant sinchronizaciją tarp gorutinų.
Pavyzdys:
ch := make(chan int) // be buferio kanalas
// Siuntimas blokuojamas, kol kas nors neskaitys
go func() {
ch <- 42
}()
reikšmė := <-ch // skaitymas išjungia siuntimą
fmt.Println(reikšmė)