Sobes.tech
Middle

Czym jest kanał w Go? Jakie są rodzaje kanałów? Czym różnią się kanały buforowane od niebuforowanych?

sobes.tech AI

Odpowiedź od AI

Kanał w Go to typ danych używany do przesyłania wartości między gorutynami, zapewniając synchronizację i wymianę danych.

Rodzaje kanałów:

  • Kanały bez bufora — nie mają wewnętrznego bufora, wysyłanie blokuje się do momentu odczytania wartości przez odbiorcę.
  • Kanały z buforem — mają wewnętrzny bufor o stałym rozmiarze, wysyłanie blokuje się tylko wtedy, gdy bufor jest pełny.

Różnice:

  • W kanałach bez bufora, nadawca i odbiorca muszą być jednocześnie gotowi do wysłania/odbioru, co zapewnia ścisłą synchronizację.
  • W kanałach z buforem, nadawca może umieścić kilka wartości w buforze bez oczekiwania na odbiorcę, dopóki bufor się nie zapełni.

Przykład tworzenia i użycia kanału z buforem:

ch := make(chan int, 2) // bufor na 2 elementy
ch <- 1
ch <- 2
// ch <- 3 // blokuje, dopóki nie zwolni się miejsce
fmt.Println(<-ch) // 1
fmt.Println(<-ch) // 2