Hi,
I'm seeing a number of issues with your example code...
You are creating a slice of channels when you really could just use a single channel to receive all of the results.
You wait on a WaitGroup, but the goroutines only call Done() *after* they are able to send their result on the channel. But, you don't start receiving from the channel until after the WaitGroup unblocks. So this deadlocks.
Even after the WaitGroup issue is resolved, the channels in that slice have actually never been created. They are nil channels, and you still end up in a deadlock when trying to receive from them.
You can see the two spots where you can comment out the WaitGroup, and make() the channels, which then allows the program to succeed and receive the values from the goroutines. But to be honest, this code can still be simplified further, since you don't need to slice of channels. You already know how many workers you are starting up, so you can either:
... or if you wanted to write the receiving logic in a way where you don't have to care how many results to expect, you can make use of the WaitGroup to control when to close the channel and end the receiving loop:
https://play.golang.org/p/c4JrMHSD4x
Justin