1 回答

TA貢獻(xiàn)1934條經(jīng)驗(yàn) 獲得超2個(gè)贊
我們可以遍歷通過(guò)通道發(fā)送的值。要打破這種迭代通道,需要明確關(guān)閉。否則 range 將以與 nil 通道相同的方式永遠(yuǎn)阻塞。在您的代碼中,您沒(méi)有關(guān)閉sum(打印功能sumValues通道)通道。這就是為什么以下功能將永遠(yuǎn)被阻止的原因。
func print(sumValues <-chan string ){
for val := range sumValues {
fmt.Println(val)
}
}
所以你必須在函數(shù)sum中的doSum所有 go 例程doSum完成后關(guān)閉函數(shù)中的通道(否則sum通道可能會(huì)在 go 例程完成之前關(guān)閉)。你可以用sync.WaitGroup它來(lái)做到這一點(diǎn)。請(qǐng)參閱下面的更新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)
}
- 1 回答
- 0 關(guān)注
- 113 瀏覽
添加回答
舉報(bào)