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 關注
- 298 瀏覽
添加回答
舉報