Goroutine Sızıntısı (ARCH5033)
Anahtar go.async.goroutine-leak · Önem warning · Kategori async
Bir goroutine, bloke olan kanal gönder/al işleminde takılır ve select + context.Done() ile bir çıkış yolu yoksa asla sonlanmaz. Bu sızan goroutine’ler bellek ve kanal kaynaklarını tutmaya devam eder.
Hatalı
Bölüm başlığı “Hatalı”func Start(ch chan int) { go func() { for { v := <-ch // gönderen durduğunda sonsuza dek bloke olur process(v) } }()}func Start(ctx context.Context, ch chan int) { go func() { for { select { case v := <-ch: process(v) case <-ctx.Done(): return } } }()}Düzeltme
Bölüm başlığı “Düzeltme”Goroutine döngüsüne select ile bir <-ctx.Done() çıkış dalı ekleyin.