将数据发送到通道片中的整数通道会导致死锁该代码预计将创建 5 个 (+1 ) 个通道。这些通道用于发送整数值,并在中接收相同的值,最后将它们扇入到 。fanInChansend()receive()fanInChan验证码:-package mainimport ( "fmt" "sync")func main() { defer fmt.Println("About to exit!") fmt.Println("Started") channels := make([]chan int, 5) fanInChan := make(chan int) go send(channels) go recive(fanInChan, channels) for val := range fanInChan { fmt.Println("Fanin", val) }}func send(channels []chan int) { defer fmt.Println("Send Ended") fmt.Println("Send Started") for i := 0; i < 100; i++ { channels[i%5] <- i } for i := 0; i < 5; i++ { close(channels[i]) }}func recive(fanin chan<- int, channels []chan int) { defer fmt.Println("Recive Ended") fmt.Println("Recive Started") var wg sync.WaitGroup wg.Add(5) for i := 0; i < 5; i++ { go func(inew int) { defer wg.Done() fmt.Println(inew) for v := range channels[inew] { fanin <- v } }(i) } wg.Wait() close(fanin)}戈朗游乐场输出:-StartedSend StartedRecive Started41230fatal error: all goroutines are asleep - deadlock!... //You can see rest on playground link above问题开始于 for 内部的循环send()for i := 0; i < 100; i++ { channels[i%5] <- i }
1 回答

墨色风雨
TA贡献1853条经验 获得超6个赞
该语句正在分配一个具有 nil 通道的数组,该通道channels := make([]chan int, 5)
从通道接收的块
<- channel
块发送到通道
channel <- value
关闭时的恐慌
close(channel)
因此,您必须单独初始化每个通道以接收整数值。
在使用数组中的通道之前,应先初始化这些通道。channels
for i := range channels { channels[i] = make(chan int) }
在行之前插入此内容并运行。go send(channels)
- 1 回答
- 0 关注
- 163 浏览
添加回答
举报
0/150
提交
取消