## waitgroup [sync.WaitGroup](https://golang.org/pkg/sync/#WaitGroup) решает задачу ожидания завершения всех горутин из набора. ### Что нужно сделать? Нужно написать реализацию WaitGroup используя каналы. Использование пакета [sync](https://golang.org/pkg/sync) в этой задаче запрещено! ```go type WaitGroup struct {} func (wg *WaitGroup) Add(delta int) {} func (wg *WaitGroup) Done() {} func (wg *WaitGroup) Wait() {} ``` `WaitGroup` можно представлять себе как число. * При инициализации переменной типа `WaitGroup` число равно нулю. * Вызов `Add` прибавляет `delta` к числу. * Вызов `Done` вычитает из числа единицу. * Если при вызове `Add` или `Done` число становится отрицательным, происходит panic. * Вызов `Wait` при числе равном нулю -- это no-op. * Вызов `Wait` при числе большем нуля блокируется до тех пор, пока число не станет равным нулю. `WaitGroup` может быть "переиспользована". После достижения нуля можно вызвать `Add` заблокировав последующий `Wait`.