你的goroutine块太多了,不仅在代码中数量太多,而且执行的goroutine也太多。循环中的第一个goroutine块不会阻塞——它会立即继续执行。不能保证在相同的块再次执行之前,之前的块已经有足够的时间将值放入通道中。这是一个竞争条件。
为了证实这一点,只需运行此代码: (set (repeatedly 10000 mojorate))
。如果所有得到的结果都是只有一个元素的一组,请增加这个数字。
这个代码片段向一个通道发送10个数字,并获取它们——除以二。
句子的前半部分是函数用户不关心的实现细节。如果你需要的只是从一个1/2开始的10个数字的向量,那么当然就是(mapv #(/ % 2) (range 1 11))
。
如果你需要其他东西,请详细描述,这样我们就不至于陷入“XY问题”。原始函数可以以多种方式重写——如果你的实际问题需要特定内容,那么所有这些方法都可能不正确。