Dev Study
Go コース

51. sync.WaitGroup — 複数の goroutine の完了を待つ

sync.WaitGroup は、起動した複数の goroutine がすべて終わるのを待つためのカウンタ付きの仕組みです。Add(n) で待つ数を増やし、各 goroutine が終了時に Done() を呼んでカウンタを1減らし、Wait() がカウンタが0になるまでブロックします。

ループの中で goroutine を起動する場合、Add は goroutine を起動する前(ループ内)で呼ぶのが鉄則です。goroutine の中で Add すると、Wait が先に走ってしまう競合が起きえます。Done は defer wg.Done() と書いておくと、途中で return してもカウンタが確実に戻ります。

下の例では各 goroutine が共有スライスの自分の担当インデックスにだけ書き込むため、競合せず安全です。Wait の後に結果を読むので、毎回同じ出力になります。

▶ サンプルコードを実行してみよう(自由に書き換えてOK)

Go
公式ドキュメントで詳しく ↗