🍺👨🏻‍💻🍳 pirosikick.com

Go言語による並行処理「4.4 orチャネル」の図

今、Go言語による並行処理(オライリー)を読んでいる。「4章 Goでの並行処理パターン」の中で「orチャネル」という関数が登場する。JavaScriptでいうところのPromise.raceみたいなもので、複数のdoneチャネルを1つのチャネルにまとめ、doneチャネル郡の中でどれかがcloseされたらまとめたチャネルもcloseする、というような関数。

この関数は再帰処理で実装されており、コードを読んでいると混乱してきたので、理解できるように図を作った。それが以下。

再帰呼び出し時に、doneチャネルだけでなく、呼び出し側のorDoneチャネル(複数のdoneチャネルをまとめたチャネル)も渡していて、これが理解できなかった。

select {
case channel[0]:
case channel[1]:
case channel[2]:
// この行、なぜorDoneも渡しているの?🤔
case or(append(channels[3:], orDone)...):
}

本ではこの部分について、以下のように説明している。

「またorDoneチャネルも渡して、木構造の上位の部分が終了したら下位の部分も終了するようにしています。」

全くそのとおりなのだが、図を書いてやっと理解できたのでスッキリした。