İçeriğe geç

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.

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
}

Yazan goroutine değer göndermeyi bitirince kanalı close(ch) ile kapatın.