我有一個數組 X ,如果條件為真,我正在嘗試對其進行范圍并刪除一些元素。在沒有任何并發的情況下執行此操作可以正常工作,但是當我嘗試同時執行此操作時出現錯誤:“切片邊界超出范圍”func main() { X := make([][]int32, 10) for i := 0; i < 10; i++ { X[i] = []int32{int32(i), int32(i)} } ch := make(chan int, 20) var wg sync.WaitGroup fmt.Println(X) for i := 0; i < 20; i++ { wg.Add(1) go func() { defer wg.Done() for index := range X { // check some condition if X[index][0]%2 == 0 && index < len(X)-1 { ch <- index break } } }() } for { ind, ok := <-ch if ok { X = append(X[:ind], X[ind+1:]...) } else { fmt.Println("closed chan") break } } wg.Wait() fmt.Println(X)}https://play.golang.org/p/YeLamAU5_Rt有什么方法可以使用索引并通過通道發送它,然后從不同的 goroutine 中刪除相應的元素?
2 回答

江戶川亂折騰
TA貢獻1851條經驗 獲得超5個贊
第一:你為什么要這樣刪除?您是否正在嘗試解決更大的問題?
如果這是您想要的方式,那么:
您正在使用緩沖通道,因此刪除 goroutine 可能會在另一個 goroutine 正在處理切片時從切片中刪除項目,從而導致意外結果。此外,您沒有關閉通道,因此 for 循環永遠不會終止。
使用無緩沖通道,并在單獨的 goroutine 中運行刪除循環。wg.Wait
然后在終止刪除 goroutine之后關閉通道。

30秒到達戰場
TA貢獻1828條經驗 獲得超6個贊
將要保留的元素復制到切片的開頭。刪除 goroutine。
keep := 0
for index := range X {
if X[index][0]%2 == 0 && index < len(X)-1 {
continue
}
X[keep] = X[index]
keep++
}
X = X[:keep]
在操場上運行它。
- 2 回答
- 0 關注
- 142 瀏覽
添加回答
舉報
0/150
提交
取消