Как реализовать очередь выполнения goroutines?
Может вам удобнее навесить вейтгруппы на процессы и запустить их все одновременно?
https://golang.org/pkg/sync/#WaitGroup
1. Каждой задаче в структуру пихаем вейтгруппу, делаем ей Add(1), а после выполнения делаем Done().
2. У каждой зависимой задачи перед выполнением делаем Wait() у вейтгрупп тех задач, которые она должна дождаться.
3. ????
4. PROFIT!!!
не знаю как лучше, но я бы это отсортировал в порядке зависимостией и поочереди выполнял бы методы.[
    {
        "method": "controller:method1",
        "params": {},
        "id": 1
    },
    {
        "method": "controller:method2",
        "params": {},
        "id": 2,
        "wait": 1
    },
    {
        "method": "controller:method2",
        "params": {},
        "id": 3,
        "wait": 1
    },
    {
        "method": "controller:method2",
        "params": {},
        "id": 4,
        "wait": 2
    }
    {
        "method": "controller:method2",
        "params": {},
        "id": 5
    }
]
привести к виду[
  [
    {
        "method": "controller:method1",
        "params": {},
        "id": 1
    },
    {
        "method": "controller:method2",
        "params": {},
        "id": 5
    }  
  ],
  [
    {
        "method": "controller:method2",
        "params": {},
        "id": 2,
        "wait": 1
    },
    {
        "method": "controller:method2",
        "params": {},
        "id": 3,
        "wait": 1
    },
  ],
  [
    {
        "method": "controller:method2",
        "params": {},
        "id": 4,
        "wait": 2
    }  
  ]
]
а потом уже как-то такfor _, step := range steps {
  for _, f : range step {
    f.method(f.params)
  }
}
что-то похоже на на графы и топологическую сортировку