2 回答
TA贡献1864条经验 获得超2个赞
我怀疑您的“if imData[ind] == e[i]”条件在前一种情况下失败了,但是如果没有通道的设置代码以及有关这些不同切片的更多详细信息,就很难判断。您是否尝试过使用 print 语句运行它以查看您从渠道中获得了什么?
另外,请注意,如果有问题的通道被缓冲,则不能保证ch
和中的值ch2
将以相同的顺序排列。这很可能是你的问题。
Goroutine 1 可以给 on 赋值ch
,但是 Goroutine 2 可以ch2
在 Goroutine 1 到达之前给 on 赋值。如果您有 7 个 goroutine,则完全有可能在通道(或任意数量的其他通道)上看到以下顺序:
ch
: 1, 2, 3, 4, 5, 6, 7
ch2
: 1, 3, 4, 5, 6, 7, 2
如果它们没有被缓冲,那么这对你的代码来说是不可能的,但它在技术上仍然是不安全的(编辑:实际上,它仍然不会与i
第二个循环匹配)。如果数据是一组有序对,您应该通过单个通道将每对作为结构发送。
顺便说一句,您只需要将变量传递给go func()
调用,如果它们预计会在调用之外发生变化。 ch
, ch2
, arx
, ary
, dirf
, 和dirg
所有这些对于这段代码来说似乎都是有效的常量,因此不需要传递给go func()
. 您只需要传入i
,因为循环在将外壳触发到 goroutine 后立即更改它。
现在,从纯粹的速度角度来看,您最好将第一个循环移动到go func()
调用中。您可以在主例程中循环时创建 7 个 goroutine,而不是创建一个例程,它会循环遍历这些值并将它们发送到通道上。如果通道被缓冲到至少那个大小,这将成为一个非常快速的操作。顺便说一句,这也解决了通道排序的问题(尽管在单个通道上将有序对作为结构发送仍然更好),因为您只有一个 goroutine 试图在通道上发送。
- 2 回答
- 0 关注
- 264 浏览
添加回答
举报