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