Golang 帮看一下,运行的时候 panic,原因是写入了关闭的 channel,请问该如何解决?

netboy · 2019-09-19 13:23:16 · 1271 次点击

原因是,你的select chan只会执行一次,遇到错误或者已完成 那么GetAll就完成了 - 然后就会调用defer close(ch)。 这时 GetAll中for循环内部N个goroutine(除了已报错和已完成的)还会执行,继续往detailChan中写数据,从而panic。

要修改的话,应该在 detailChan <- detail 这里加上ctx.Err()!=nil 的判断 - 还需要保证原子性。 不过你注释的那段代码貌似可以解决问题,很有意思。

#5
更多评论

在play.golang.org运行了上述代码. 没有出现panic的问题

#1

这个不是稳定浮现的,需要多运行几次。

#2