В main:
var wg sync.WaitGroup
...
Перед запуском каждой горутины сделать wg.Add(1) (не в самих горутинах, а в том же main прямо перед go ...
В каждую горутину первой строчкой добавить defer func() { wg.Done() }()
Потом в main создать еще одну горутину - контролирующую. В ней всего 2 строчки:
wg.Wait()
close(канал)
Ну и дальше в main остальной код.