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.