Limitar a simultaneidade em ir com WaitGroups é fácil; aqui está um exemplo básico. Cada parte é explicada no meu blog .
package main
import "sync"
func main() {
var wg sync.WaitGroup
wg.Add(1)
go func(wg *sync.WaitGroup) {
AccessALimitedResource()
wg.Done()
}(&wg)
wg.Wait()
}