sync.WaitGroupを使用した並列処理

ループ毎の処理すべてを並列に実行したい場合など

package main

import (
    "sync"
)

func main() {
 var IDs = []string{
        "1",
        "2",
        "3",
        "4",
        "5",
    }
    var wg sync.WaitGroup
    for i := 0; i < len(IDs); i++ {
        wg.Add(1) // インクリメント
        go func(ID string) {
            // なんらかの非同期処理
            defer wg.Done()// 完了時wgをデクリメント
        }(IDs[i])
    }
    wg.Wait()
}

sync.WaitGroupは複数のgoroutineの完了を待ちます。
WaitGroupの値に対してメソッドWaitを呼ぶと、WaitGroupが0になるまでWaitはブロックするようになります。
そのため、実行したい処理の数だけWaitGroupの値をインクリメントさせておき、処理完了時にデクリメントすれば、Waitを呼んで処理完了を待っているmain goroutineは、すべての処理が完了します。
waitを入れずに実行してしまうと、処理を待たずにmain goroutineが終了してしまうので忘れずにいれましょう。

よくまとまっていて参考になった
【参考】
ゴルーチン、チャネルを利用した並行パターン

関連記事