Ваш канал не буферизован (вы не указали размер буфера при создании () канала.Это означает, что запись в канал блокируется до считывания записанного значения.И вы читаете из канала после вашего вызова wg.Wait (), так что ничто никогда не будет прочитано, и все ваши подпрограммы застрянут при блокирующей записи.
Тем не менее, вам здесь не нужна WaitGroup.WaitGroups хороши, когда вы не знаете, когда закончится ваша процедура, но вы отправляете результаты обратно, так что вы знаете.Вот пример кода, который аналогичен тому, что вы пытаетесь сделать (с фальшивым рабочим грузом).
package main
import (
"fmt"
"time"
)
func main() {
var procs int = 0
filenames := []string{"file1", "file2", "file3", "file4"}
mychan := make(chan string)
for _, f := range filenames {
procs += 1
// worker
go func(f string) {
fmt.Printf("Worker processing %v\n", f)
time.Sleep(time.Second)
mychan <- f
}(f)
}
for i := 0; i < procs; i++ {
select {
case msg := <-mychan:
fmt.Printf("got %v from worker channel\n", msg)
}
}
}
Протестируйте его на игровой площадке здесь https://play.golang.org/p/RtMkYbAqtGO