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

netboy · · 1113 次点击
原因是,你的select chan只会执行一次,遇到**错误**或者**已完成** 那么GetAll就完成了 - 然后就会调用defer close(ch)。 这时 GetAll中for循环内部N个goroutine(除了已报错和已完成的)还会执行,继续往detailChan中写数据,从而panic。 要修改的话,应该在 detailChan <- detail 这里加上ctx.Err()!=nil 的判断 - 还需要保证原子性。 不过你注释的那段代码貌似可以解决问题,很有意思。
#5
更多评论
在play.golang.org运行了上述代码. 没有出现panic的问题
#1
这个不是稳定浮现的,需要多运行几次。
#2