Hoe kunt u bepalen dat alle kanalen gesloten zijn vanuit de Main-methode?
sobes.tech AI
Antwoord van AI
In Go kan men op verschillende manieren bepalen dat alle kanalen gesloten zijn vanuit de main-methode, afhankelijk van de context:
-
Gebruik een kanaal om het einde te signaleren — bijvoorbeeld, sluit een apart kanaal wanneer alle werkende goroutines klaar zijn.
-
Controleer het sluiten van het kanaal bij het lezen — bij het lezen uit een kanaal geeft de operator
v, ok := <-chok == falseterug als het kanaal gesloten is en alle gegevens gelezen zijn. -
Gebruik
sync.WaitGroupom te wachten tot alle goroutines die in het kanaal schrijven klaar zijn, en sluit vervolgens het kanaal inmainna hun voltooiing.
Voorbeeld met WaitGroup:
var wg sync.WaitGroup
ch := make(chan int)
wg.Add(1)
go func() {
defer wg.Done()
// werken met het kanaal
ch <- 1
}()
// In een aparte goroutine sluiten we het kanaal nadat alle zenders klaar zijn
go func() {
wg.Wait()
close(ch)
}()
for v := range ch {
fmt.Println(v) // de lus eindigt wanneer het kanaal gesloten wordt
}
Op deze manier kan in main worden vastgesteld dat het kanaal gesloten is wanneer de lus erover eindigt, wat betekent dat alle gegevens verzonden en het kanaal gesloten is.