Мы можем перебирать значения, передаваемые по каналу. Чтобы прервать такую итерацию, канал необходимо явно закрыть. В противном случае диапазон будет блокироваться навсегда так же, как для нулевого канала. В вашем коде вы не закрыли канал sum
(для функции печати sumValues
канал). Поэтому следующая функция будет заблокирована навсегда.
func print(sumValues <-chan string ){
for val := range sumValues {
fmt.Println(val)
}
}
Таким образом, вы должны закрыть канал sum
в функции doSum
после завершения всех подпрограмм go в функции doSum
(в противном случае канал sum
может быть закрыт до завершения подпрограмм go). Вы можете использовать sync.WaitGroup
для этого. Смотрите обновленную функцию doSum
ниже:
func doSum(sum chan<- string, oddChan <-chan int, evenChan <-chan int) {
var waitGroup sync.WaitGroup
waitGroup.Add(2) // Must wait for 2 calls to 'done' before moving on
go func(sum chan<- string) {
s1 := 0
for val := range oddChan {
s1 += val
}
sum <- fmt.Sprint("sum of odd number = ", s1)
waitGroup.Done()
}(sum)
go func(sum chan<- string) {
s1 := 0
for val := range evenChan {
s1 += val
}
sum <- fmt.Sprint("sum of even number = ", s1)
waitGroup.Done()
}(sum)
// Waiting for all goroutines to exit
waitGroup.Wait()
// all goroutines are complete now close the sum channel
close(sum)
}