请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

老师这个运行能打印字符,但是有错误,找不到问题

// 分别打印 a A b B c C ....
func main() {
  ch := make(chan int)
  go func(ch chan int) {
     lowerCharFrom := 97
     upCharFrom := 65
     for i := 0; i < 26; i++ {
        ch <- lowerCharFrom + i
        ch <- upCharFrom + i
     }
  }(ch)
  for v := range ch {
     fmt.Println(string(v))
  }
}


报错:fatal error: all goroutines are asleep - deadlock!             

goroutine 1 [chan receive]:

正在回答 回答被采纳积分+3

1回答

ccmouse 2018-08-19 10:43:46

一头用了range来接收,那么发送方发完需要去close这个channel。我课上会有说到。

0 回复 有任何疑惑可以回复我~
  • 提问者 yangxinxin #1
    嗯嗯,可是如果这样写就不会deadlock,把go协程里面的逻辑和外面的逻辑交换一下,这样的话,同样不需要关闭channel,同样也在使用range接收数据,
    func main() {
    	ch := make(chan int)
    	go func(ch chan int) {
    		for v := range ch {
    			fmt.Println(string(v))
    		}
    	}(ch)
    	lowerCharFrom := 97
    	upCharFrom := 65
    	for i := 0; i < 26; i++ {
    		ch <- lowerCharFrom + i
    		ch <- upCharFrom + i
    	}
    	time.Sleep(10*time.Second)
    }
    回复 有任何疑惑可以回复我~ 2018-08-23 12:45:20
  • 提问者 yangxinxin #2
    func main() {
    	ch := make(chan int)
    	go func(ch chan int) {
    		for v := range ch {
    			fmt.Println(string(v))
    		}
    	}(ch)
    	lowerCharFrom := 97
    	upCharFrom := 65
    	for i := 0; i < 26; i++ {
    		ch <- lowerCharFrom + i
    		ch <- upCharFrom + i
    	}
    	time.Sleep(10 * time.Second)
    }
    回复 有任何疑惑可以回复我~ 2018-08-23 12:47:19
  • hen_nam 回复 提问者 yangxinxin #3
    第一段代码,main 函数从通道接收所有数据后会阻塞,没有退出条件。
    回复 有任何疑惑可以回复我~ 2021-12-26 16:14:29
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信