Sobes.tech
Middle

Co lze a co nelze dělat s bezpečností toku v kanálech v Go?

sobes.tech AI

Odpověď od AI

Lze:

  • Posílat a přijímat data. Každé čtení a zápis do kanálu je atomická operace.
  • Zavřít kanál. Zavření signalizuje, že odesílání dat je ukončeno.
  • Použít operátor select pro neblokující interakci s více kanály.
  • Použít bufferované a nebufferované kanály pro různé scénáře synchronizace.

Nelze:

  • Zavřít kanál z více gorutin současně bez dodatečné synchronizace. To může vést k panice.
  • Zavřít již zavřený kanál. To také způsobí paniku.
  • Posílat data do uzavřeného kanálu. To způsobí paniku.
  • Čekat na čtení z nulového (neinicializovaného) kanálu. To zablokuje gorutinu.
  • Čekat na zápis do nulového (neinicializovaného) kanálu. To zablokuje gorutinu.

Příklad použití kanálů:

// Vytvoření nebufferovaného kanálu pro int
messages := make(chan int)

// Gorutina pro odesílání dat
go func() {
	messages <- 1 // Odeslat 1 do kanálu
	messages <- 2 // Odeslat 2 do kanálu
	close(messages) // Zavřít kanál po odeslání
}()

// Čtení dat z kanálu
firstMessage := <-messages
secondMessage := <-messages

// Čtení z uzavřeného kanálu vrací nulovou hodnotu a ok=false
value, ok := <-messages