Middle
Čo je kanál v Go? Aké druhy kanálov existujú? Čo odlišuje bufferované od nebufferovaných?
sobes.tech AI
Odpoveď od AI
Kanál v jazyku Go je dátový typ, ktorý sa používa na prenos hodnôt medzi gorutinami, zabezpečujúc synchronizáciu a výmenu dát.
Typy kanálov:
- Kanály bez vyrovnávacej pamäte — nemajú vnútornú vyrovnávaciu pamäť, odoslanie sa blokuje, kým príjemca ne prečíta hodnotu.
- Kanály s vyrovnávacou pamäťou — majú vnútornú vyrovnávaciu pamäť pevnej veľkosti, a odoslanie sa blokuje iba v prípade, že je vyrovnávacia pamäť plná.
Rozdiely:
- Pri kanáloch bez vyrovnávacej pamäti musia byť odosielateľ aj príjemca pripravení súčasne na odoslanie/príjem, čo zabezpečuje prísnu synchronizáciu.
- Pri kanáloch s vyrovnávacou pamäťou môže odosielateľ vložiť niekoľko hodnôt do vyrovnávacej pamäti bez čakania na príjemcu, kým sa vyrovnávacia pamäť nezaplní.
Príklad vytvorenia a použitia vyrovnávacieho kanála:
ch := make(chan int, 2) // vyrovnávacia pamäť na 2 prvky
ch <- 1
ch <- 2
// ch <- 3 // blokuje, kým sa neuvoľní miesto
fmt.Println(<-ch) // 1
fmt.Println(<-ch) // 2