The reading part isn\'t concurrent but the processing is. I phrased the title this way because I\'m most likely to search for this problem again using that phrase. :)
Edit: The answer by @tomasz above is the correct one. Please disregard this answer.
You need to do two things:
The use of buffered channels is essential because unbuffered channels need a receive for each send, which is causing the deadlock you're hitting.
If you fix that, you'll run into a deadlock when you try to receive the results, because results hasn't been closed.
Here's the fixed playground: http://play.golang.org/p/DtS8Matgi5