Kapatılmayan Kanal Üzerinde Range (ARCH5036)
Anahtar go.async.range-chan-no-close · Önem warning · Kategori async
Bir kanal üzerinde range ile döngü kurulduğunda, kanal hiçbir yerde kapatılmazsa son değerden sonra döngü sonsuza dek bloke olur. Kanalı yazan taraf işini bitirince close çağırmalıdır.
Hatalı
Bölüm başlığı “Hatalı”func Sum(nums []int) int { ch := make(chan int) go func() { for _, n := range nums { ch <- n } // close eksik }() total := 0 for v := range ch { // son değerden sonra bloke olur total += v } return total}func Sum(nums []int) int { ch := make(chan int) go func() { for _, n := range nums { ch <- n } close(ch) }() total := 0 for v := range ch { total += v } return total}Düzeltme
Bölüm başlığı “Düzeltme”Yazan goroutine değer göndermeyi bitirince kanalı close(ch) ile kapatın.