No.62: ゴルーチンを停止するタイミングをわからずに起動する
無計画にゴルーチンを起動するとゴルーチンリークにつながる可能性がある。
ゴルーチンは、ヒープに割り当てられた変数、HTTP、データベースのコネクション、オープンされているファイル、ネットワークソケットなど、保持できる。ゴルーチンがリークすると、これらもリークする。
ゴルーチンを起動するならば、いつ停止するのかについて明確に計画を立てなければならない。
ゴルーチンの生存期間がアプリケーションの生存期間に結びついている場合、アプリケーションを終了する前にそのゴルーチンが完了するのを待つ方が安全。
mainから呼び出したfunctionの中で起動したゴルーチンは、mainがリターンした時にキャンセルされるようなコンテキストを渡す。
終了時に親ゴルーチンを待たせるようにする。
func main() {
w := newWatcher()
defer w.close() // ←closeメソッドの呼び出しを遅延させる
// アプリケーションを実行
}
func newWatcher() watcher {
w := watcher()
go w.watch()
return w
}
func (w watcher) close() {
// 資源をクローズさせる
}