开发者社区> 问答> 正文

go关键字配合channel的正确使用方法是什么??报错

多线程代码这样:

package main

import "fmt"

func Add(x, y int, ch chan int) {
	ch <- x + y
	fmt.Println("Adding")
}

func main() {

	chs := make(chan int, 5)
	for i := 0; i < 10; i++ {
		go Add(i, i, chs)
	}

	for value := range chs {
		//value := <-ch
		fmt.Println(value)
	}
	//close(chs)
}

使用liteIDE运行结果:

c:/go/bin/go.exe run add.go [D:/goproject/study/src/goThread]
Adding
Adding
Adding
Adding
Adding
0
2
4
6
8
Adding
Adding
Adding
Adding
Adding
10
12
14
16
18
fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan receive]:
main.main()
	D:/goproject/study/src/goThread/add.go:17 +0x96
exit status 2
错误: 进程退出代码 1.

运行结果是出来了,但是怎么才能不让它报错?

 

 

展开
收起
爱吃鱼的程序员 2020-06-14 16:57:55 517 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    那个channel要在数据传输完毕的时候关闭,而且要在数据的发送端关闭。

    好像是这样的。

    你看我这样就没报错:


    packagemainimport"fmt"varcountint=0;funcAdd(x,yint,chchanint){ch<-x+yfmt.Println("Adding")count++ifcount==10{close(ch)}}funcmain(){chs:=make(chanint,5)fori:=0;i<10;i++{goAdd(i,i,chs)}forvalue:=rangechs{//value:=<-chfmt.Println(value)}//close(chs)}



    我放了个计数器count,当计数器到了10我就关闭channel。多谢!
    2020-06-14 16:58:11
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Go语言路上踩过的坑 立即下载
gohbase :HBase go客户端 立即下载
Go构建日请求千亿级微服务实践 立即下载