Sobes.tech
Middle

Čo je možné a čo nie je možné robiť s bezpečnosťou toku v kanáloch v Go?

sobes.tech AI

Odpoveď od AI

Môže:

  • Posielať a prijímať údaje. Každé čítanie a zápis do kanála je atómová operácia.
  • Zatvoriť kanál. Zatvorenie signalizuje ukončenie odosielania údajov.
  • Použiť operátor select na neblokujúcu interakciu s viacerými kanálmi.
  • Použiť kanály s vyrovnávacou pamäťou a bez nej pre rôzne scenáre synchronizácie.

Nedá sa:

  • Zatvoriť kanál z viacerých gorútín naraz bez dodatočnej synchronizácie. To môže viesť k panike.
  • Zatvoriť už zatvorený kanál. To tiež spôsobí paniku.
  • Poslať údaje do zatvoreného kanála. To spôsobí paniku.
  • Čakať na čítanie z nulového (neinicializovaného) kanála. To zablokuje gorutínu.
  • Čakať na zápis do nulového (neinicializovaného) kanála. To zablokuje gorutínu.

Príklad použitia kanálov:

// Vytvorenie nebufferovaného kanála pre int
messages := make(chan int)

// Gorutina na odosielanie údajov
go func() {
	messages <- 1 // Pošle 1 do kanála
	messages <- 2 // Pošle 2 do kanála
	close(messages) // Zatvorí kanál po odoslaní
}()

// Čítanie údajov z kanála
firstMessage := <-messages
secondMessage := <-messages

// Čítanie z uzavretého kanála vráti nulovú hodnotu a ok=false
value, ok := <-messages