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
selectpro 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