我有一个简单的示例,并且不知道如何解决它以使其按预期工作。
它应该打印Result: 30
,但屏幕显示:致命错误:所有goroutine都在睡眠中-死锁!
我认为这里的问题是语句for val := range data
。当数据通道为空时,它仍然等待接收数据。但是我没有解决方法,请帮帮我。
package main
import (
"fmt"
)
func senderSide(data chan int) {
num := 5
for i := 1; i <= num; i++ {
data <- i
}
// close(data) //panic: send on closed channel if uncomment it
}
func receiverSide(data chan int, resp chan int) {
sum := 0
for val := range data {
sum += val
}
resp <- sum
}
func main() {
data := make(chan int)
resp := make(chan int)
go senderSide(data)
go senderSide(data)
go receiverSide(data, resp)
result := <-resp
fmt.Printf("Result: %v\n", result) //result = 30
}
答案 0 :(得分:2)
我不太了解您的问题,但是僵局很容易解释。您永远不会关闭data
通道,因此recevierSide
中的循环永远不会关闭,因为它一直在等待更多数据。
这反过来意味着它从不发送响应,因此程序会死锁。