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 は一度使ったあとにコピーしてはいけない

関連

出典