Golangの箴言 > channelのclose
Go言語において、チャネルにはファイルやネットワーク操作のような「スコープを抜けたら自動でクローズされる」といった言語組み込みの仕組みはありません。
しかし、Goらしい(イディオマティックな)書き方で、より安全かつ「自動的にクローズされるように見せる」アプローチや、そもそも「クローズを不要にする」設計のアプローチはいくつかあります。
1. deferを使って確実かつ自動的に閉じる(推奨)
Goで最も一般的で安全な書き方は defer を使う方法です。ゴルーチンの先頭で宣言しておけば、その関数内の処理が終わった時(途中で return したりパニックが発生した時も含めて)に必ず自動で実行されます。
2. カプセル化してメインの処理を綺麗にする(ジェネレーターパターン)
「チャネルを作る」「別ゴルーチンで処理する」「終わったら閉じる」という一連の処理を別の関数に切り出すパターンです。これなら、使う側(main)からはチャネルの生成やクローズを全く気にしなくてよくなります。
3. そもそも close しない(要件による)
重要な事実として、Goのチャネルは使い終わったらガベージコレクション(GC)によって自動的にメモリから破棄されます。 ファイルやデータベースのコネクションのように「リソース解放のために必ずクローズしなければならない」というものではありません。
close を呼ぶ唯一の理由は、「これ以上データは来ないよ」ということを受信側に伝える(range ループなどを終わらせる)ためです。
もし、今回のように「1つだけ値を受け取って終わる」ことが分かっているなら、range を使わずに直接値を受け取るようにすれば、close 自体を書かなくても全く問題ありません。
結論
Goで開発を進める際、処理が複雑になっても閉じ忘れを防ぐために defer close(jobs) を使うのが最も一般的で、皆のお気に入り(皆の共通認識)となっている書き方です。