请教一个goroutine报错问题?

lane3000 · · 1028 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

请教一个goroutine报错问题,在《Go语言高级编程》有个并行版的素数筛子的例子,我想让主程序结束的时候,释放每个筛子所在的管道(资源),修改成如下代码,但是运行会有错误发生,意思是管道关闭后,又执行了写操作,但是不太清楚,为什么会发生这种情况,代码如下,请大牛分析一下原因是什么? ```go package prime import ( "bytes" "fmt" "runtime" "strconv" "sync" ) var wg1 = sync.WaitGroup{} var chexit = make(chan bool) func gen(name string) chan int { ch := make(chan int) wg1.Add(1) go func() { for i := 2; ; i++ { select { case ch <- i: case <-chexit: close(ch) fmt.Println("go routine exit:", name) wg1.Done() return } } }() return ch } func primeFilter(chin chan int, prime int, name string) chan int { chout := make(chan int) wg1.Add(1) go func() { for { select { case v := <-chin: if v%prime != 0 { chout <- v } case <-chexit: close(chout) fmt.Println("go routine exit:", name) wg1.Done() return } } }() return chout } func Prime() { ch := gen("generate numbers") for i := 0; i < 100; i++ { v := <-ch //log.Printf("%d,%d\n", i+1, v) ch = primeFilter(ch, v, "filter "+strconv.Itoa(i)) } close(chexit) wg1.Wait() } ```

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1028 次点击  
加入收藏 微博
3 回复  |  直到 2021-05-21 10:25:11
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传