如果有多个发送者在该通道上发送数据,接收方如何知道单个通道上的数据为空?

时间:2018-12-10 17:37:00

标签: go channel

我有一个简单的示例,并且不知道如何解决它以使其按预期工作。

它应该打印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
}

1 个答案:

答案 0 :(得分:2)

我不太了解您的问题,但是僵局很容易解释。您永远不会关闭data通道,因此recevierSide中的循环永远不会关闭,因为它一直在等待更多数据。

这反过来意味着它从不发送响应,因此程序会死锁。