gpt4 book ai didi

go - 如果有多个发送方在该 channel 上发送数据,接收方如何知道该 channel 上的数据为空?

转载 作者:数据小太阳 更新时间:2023-10-29 03:32:28 25 4
gpt4 key购买 nike

我有一个简单的示例,但不知道如何修复它以使其按我的预期工作。

它应该打印 Result: 30 但屏幕显示:fatal error: all goroutines are asleep - deadlock!

我认为这里的问题是语句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
}

最佳答案

我不是很明白你的问题,但死锁很容易解释。您永远不会关闭 data channel ,因此 recevierSide 中的循环永远不会关闭,因为它一直在等待更多数据。

这反过来意味着它永远不会发送响应,所以程序会死锁。

关于go - 如果有多个发送方在该 channel 上发送数据,接收方如何知道该 channel 上的数据为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53710814/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com