Middle
Co je kanál v Go? Jaké druhy kanálů existují? Čím se liší bufferované od nebufferovaných kanálů?
sobes.tech AI
Odpověď od AI
Kanál v jazyce Go je datový typ používaný k přenosu hodnot mezi gorutinami, zajišťující synchronizaci a výměnu dat.
Typy kanálů:
- Kanály bez vyrovnávací paměti — nemají vnitřní buffer, odeslání se blokuje, dokud příjemce ne přečte hodnotu.
- Kanály s vyrovnávací pamětí — mají vnitřní buffer pevné velikosti, a odeslání se blokuje pouze v případě, že je buffer plný.
Rozdíly:
- U kanálů bez vyrovnávací paměti musí být odesílatel i příjemce připraveni současně, což zajišťuje přísnou synchronizaci.
- U kanálů s vyrovnávací pamětí může odesílatel vložit několik hodnot do bufferu bez čekání na příjemce, dokud není buffer plný.
Příklad vytvoření a použití vyrovnávacího kanálu:
ch := make(chan int, 2) // buffer o velikosti 2
ch <- 1
ch <- 2
// ch <- 3 // blokuje, dokud se neuvolní místo
fmt.Println(<-ch) // 1
fmt.Println(<-ch) // 2