Sobes.tech
Middle

Millised kanalitüübid on Go-s? Räägi bufer- ja mittebuferkanalidest.

sobes.tech AI

Vastus AI-lt

Go keeles kanalid (channels) on peamised kaks tüüpi: buferiga ja buferita.

  • Buferita kanalid on kanalid ilma sisemise buferita. Sellesse kanalisse saatmine blokeerub kuni teine goroutine loeb väärtuse kanalist, ja vastupidi — lugemine blokeerub kuni väärtus ilmub. See tagab sünkroniseerimise goroutine'ide vahel.

  • Buferiga kanalid omavad fikseeritud suurusega sisemist buferit. Saatmine kanalisse blokeerub ainult siis, kui bufer on täis, ja lugemine, kui bufer on tühi. See võimaldab teatud määral asünkroonilisust saatja ja vastuvõtja vahel.

Näide loomise ja kasutamise kohta:

ch := make(chan int)         // buferita kanal
chBuf := make(chan int, 3)   // buferiga kanal, 3 elementi

// Buferita kanal nõuab sünkroniseerimist:
ngo func() {
    ch <- 42 // blokeerub kuni keegi teine loeb
}()
väärtus := <-ch

// Buferiga kanal võimaldab saata kuni 3 elementi ilma blokeerimiseta:
chBuf <- 1
chBuf <- 2
chBuf <- 3
// Kui üritatakse saata 4. elementi, blokeerub see kuni see loetakse välja

väärtusBuf := <-chBuf

Seega, kanali tüübi valik sõltub sünkroniseerimise ja jõudluse nõuetest.