Sobes.tech
Middle

Aké typy kanálov sú v Go? Porozprávaj o vyrovnávacích a nevyrovnávacích kanáloch.

sobes.tech AI

Odpoveď od AI

V jazyku Go existujú dva hlavné typy kanálov (channels): s bufferom a bez neho.

  • Kanály bez bufferu sú kanály bez vnútorného bufferu. Odoslanie do takého kanála sa zablokuje, kým iná gorutina ne prečíta hodnotu z kanála, a naopak — čítanie sa zablokuje, kým sa neobjaví hodnota. To zabezpečuje synchronizáciu medzi gorutinami.

  • Kanály s bufferom majú vnútorný buffer pevnej veľkosti. Odoslanie do kanála sa zablokuje iba v prípade, že je buffer plný, a čítanie, ak je buffer prázdny. To umožňuje určitú asynchrónnosť medzi odosielateľom a prijímateľom.

Príklad vytvorenia a použitia:

ch := make(chan int)         // kanál bez bufferu
chBuf := make(chan int, 3)   // kanál s bufferom na 3 prvky

// Kanál bez bufferu vyžaduje synchronizáciu:
ngo func() {
    ch <- 42 // zablokuje sa, kým niekto ne prečíta
}()
hodnota := <-ch

// Kanál s bufferom umožňuje odoslať až 3 prvky bez blokovania:
chBuf <- 1
chBuf <- 2
chBuf <- 3
// Pri pokuse odoslať štvrtý prvok, dôjde k blokovaniu, kým nebude prečítaný

hodnotaBuf := <-chBuf

Výber typu kanála závisí od požiadaviek na synchronizáciu a výkon.