为了账号安全,请及时绑定邮箱和手机立即绑定

抛出:所有goroutine都在睡觉-死锁

抛出:所有goroutine都在睡觉-死锁

Go
DIEA 2021-05-11 17:53:39
给出以下简单的Go程序package mainimport (    "fmt")func total(ch chan int) {    res := 0    for iter := range ch {        res += iter    }    ch <- res}func main() {    ch := make(chan int)    go total(ch)    ch <- 1    ch <- 2    ch <- 3    fmt.Println("Total is ", <-ch)}我想知道有人能否启发我throw: all goroutines are asleep - deadlock!谢谢你
查看完整描述

2 回答

?
森栏

TA贡献1810条经验 获得超5个赞

由于您从不关闭ch通道,因此范围循环将永远不会结束。


您无法在同一频道上发送结果。一种解决方案是使用不同的解决方案。


您的程序可以像这样进行修改:


package main


import (

    "fmt"

)


func total(in chan int, out chan int) {

    res := 0

    for iter := range in {

        res += iter

    }

    out <- res // sends back the result

}


func main() {

    ch := make(chan int)

    rch  := make(chan int)

    go total(ch, rch)

    ch <- 1

    ch <- 2

    ch <- 3

    close (ch) // this will end the loop in the total function

    result := <- rch // waits for total to give the result

    fmt.Println("Total is ", result)

}


查看完整回答
反对 回复 2021-05-17
  • 2 回答
  • 0 关注
  • 162 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信