一般には sync.WaitGroup で実現される並行処理の完了待機を、チャネル( chan )だけをつかって記述することはできますか?

var wg sync.WaitGroup
for i := 0; i < 10; i++ {
  wg.Add(1)
  go func(i int) {
    // 並行処理[i]
    wg.Done()
  }(i)
}
wg.Wait()