Junior — Middle
Ako určiť, že všetky kanály sú zatvorené z metódy Main?
sobes.tech AI
Odpoveď od AI
V jazyku Go je možné určiť, že všetky kanály sú zatvorené z metódy main, rôznymi spôsobmi v závislosti od kontextu:
-
Použitie kanála na signalizáciu ukončenia — napríklad, zatvorením samostatného kanála, keď všetky pracovné gorutiny skončia.
-
Kontrola zatvorenia kanála pri čítaní — pri čítaní z kanála operátor
v, ok := <-chvrátiok == false, ak je kanál zatvorený a všetky dáta prečítané. -
Použitie
sync.WaitGroupna čakanie na dokončenie všetkých gorutín, ktoré zapisujú do kanála, a následné zatvorenie kanála vmainpo ich dokončení.
Príklad s WaitGroup:
var wg sync.WaitGroup
ch := make(chan int)
wg.Add(1)
go func() {
defer wg.Done()
// práca s kanálom
ch <- 1
}()
// V samostatnej gorutine zatvárame kanál po dokončení všetkých odosielateľov
go func() {
wg.Wait()
close(ch)
}()
for v := range ch {
fmt.Println(v) // cyklus sa ukončí, keď sa kanál zatvorí
}
Týmto spôsobom je možné v main určiť, že kanál je zatvorený, keď sa cyklus nad ním ukončí, čo znamená, že všetky dáta boli odoslané a kanál je zatvorený.