Поскольку вы используете WaitGroup
и увеличиваете счетчик во время запуска новой программы, вы должны уведомить WaitGroup
о завершении процедуры, вызвав метод Done()
.Также вы должны передать тот же WaitGroup
в рутину.Вы можете сделать это, передав адрес WaitGroup
.В противном случае каждая программа будет использовать свою собственную WaitGroup
, которая будет иметь различную область видимости.
func main() {
ch := make(chan data)
wg := &sync.WaitGroup{}
for _, instance := range dataSet {
wg.Add(1)
go doStuff(ch, instance, wg)
}
go func() {
wg.Wait()
close(ch)
}()
for v := range ch { //range until it closes
//proceed v
}
}
func doStuff(ch chan data, instance data, wg *sync.WaitGroup) {
//do some stuff with instance...
ch <- instance
// call done method to decrease the counter of WaitGroup
wg.Done()
}