TL;DR
Go で、複数のゴルーチンの完了を待つための同期プリミティブ。sync パッケージの WaitGroup 構造体が提供する。
仕組み
WaitGroup は内部にカウンタを持ち、次のメソッドでそれを操作する。
Add(delta int): カウンタにdeltaを足す。deltaは負でもよいDone(): カウンタを 1 減らす。Add(-1)と同じであるWait(): カウンタが 0 になるまでブロックする
カウンタが 0 になると、Wait() でブロックしていたゴルーチンがすべて再開する。Go 1.25 では、関数を新しいゴルーチンで実行し、そのタスクを WaitGroup に加える Go(f func()) が追加された。f が返るとタスクは WaitGroup から外れる。公式ドキュメントは Done() よりも Go() を使うよう勧めている。
注意点
- カウンタが負になると、
Addは panic する WaitGroupは一度使ったあとにコピーしてはいけない