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