Go is famous for making concurrency easy, through good language
support for goroutines. Except
what Go makes easy is only one level of concurrency, the nuts and
bolts level of making your code do things concurrently and
communicating back and forth through channels. Making it do the
right things concurrently is still up to you, and unfortunately Go
doesn't currently provide a lot of standard library support for
correctly implemented standard concurrency patterns.
For example, one common need is for a limited amount of concurrency;
you want to do several things at once, but only so many of them. At
the moment this is up to you to implement on top of goroutines,
channels, and things like the sync
package. This is not as easy as it looks, and quite competent people
can make mistakes here. As it happens, I have an example ready to
hand today.