Sobes.tech
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