は、簡略化した例として、以下のコードを検討:ガベージコレクタは続行されないGoルーチンを収集しますか?
func printer(c <-chan int) {
for {
fmt.Print(<-c)
}
}
func provide() {
c := make(chan int)
go printer(c)
for i := 1; i <= 100; i++ {
c <- i
}
}
機能provide
はprovide
が生成するデータを印刷することprinter
ルーチン行くを作成します。
私の質問は、provide
が返ってから何が起こり、printer
が空のチャンネルでブロックを開始するかです。 c
への参照がないか、またはガベージコレクタがこのケースをキャッチし、goルーチンとc
の両方を処分しますか?
この種のコードでメモリリークが発生する場合は、そのようなメモリリークを防ぐためにどのような対策を講ずることができますか?
ありがとうございます。明らかに私の "解決策"は本当にうまくいかなかった。 – fuz
プリンタのゴルーチンの範囲句を使用すると、v:= range c {fmt.Println(v)}のokチェックを避けることができます。 – Philipp
@Philipp:うん、そうです。 – zzzz