TL;DR
共有のチャネル(done チャネル)を閉じることで、複数のゴルーチンに処理の終了を一斉に伝える Go のパターン。
なぜ必要か
Pipeline pattern で下流が途中で受信をやめると、上流のゴルーチンは送信でブロックしたままになり、リソースがリークする。明示的に終了を伝える手段が必要になる。
仕組み
閉じたチャネルからの受信は、すぐに要素型のゼロ値を返して進む。そのため、done チャネルを閉じることは、全ゴルーチンへのブロードキャストとして働く。各ステージは送信と一緒に done からの受信を select で待ち、done が閉じられたらすぐに return する。main で defer close(done) と書けば、どの経路で return しても終了が伝わる。