1 回答

TA貢獻1906條經(jīng)驗 獲得超3個贊
競爭是因為你的 for 循環(huán)正在更新,i而你的 goroutine 正在i同時讀取。解決這個問題的一種方法是傳遞i給你的 goroutine 函數(shù):
for i := 0; i < numOfOperations; i++ {
? ? wg.Add(1)
? ? go func(i int) {? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// <----------- CHANGE THIS
? ? ? ? err := Set("key", strconv.Itoa(i))
? ? ? ? if err != nil {
? ? ? ? ? ? t.Errorf("error when setting key value: %s", err)
? ? ? ? }
? ? ? ? wg.Done()
? ? }(i)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// <----------- AND THIS
}
這樣你就不再有一個閉包i,并且i你的 goroutine 函數(shù)內(nèi)部是一個獨特的值,可以在不受外部干擾的情況下讀取(或?qū)懭耄?/p>
這還解決了競爭檢測器找不到的另一個錯誤:在循環(huán)中for,重復使用遞增的變量,這意味著您當前的版本實際上i在許多情況下無意中使用相同的值,并跳過其他值。
- 1 回答
- 0 關(guān)注
- 131 瀏覽
添加回答
舉報