切片循環內就地刪除元素
問題:
訪問切片元素從我範圍內的for 循環並使用append() 刪除它們是有問題的。遞增循環變數 (i) 可能會在刪除後跳過後續元素,導致處理不完整。
最佳實踐:
1.手動循環變數遞減
使用常規for 循環和手動循環變數(i>
<code class="go">for i := 0; i < len(a); i++ { if conditionMeets(a[i]) { a = append(a[:i], a[i+1:]...) i-- } }使用常規for 循環和手動循環變數(i>
使用常規for 循環和手動循環變數(i>
使用常規for 循環和手動循環變數(i ) 刪除元素時遞減:<code class="go">for i := len(a) - 1; i >= 0; i-- { if conditionMeets(a[i]) { a = append(a[:i], a[i+1:]...) } }</code>
2.向下循環
或者,使用向下循環以避免手動遞減:<code class="go">b := make([]string, len(a)) copied := 0 for _, s := range(a) { if !conditionMeets(s) { b[copied] = s copied++ } } b = b[:copied]</code>
3.不可移除元素複製
如果需要移除的元素較多,可以考慮將不可移除元素複製到新切片以提高效率:<code class="go">copied := 0 for i := 0; i < len(a); i++ { if !conditionMeets(a[i]) { a[copied] = a[i] copied++ } } for i := copied; i < len(a); i++ { a[i] = "" // Zero places of removed elements } a = a[:copied]</code>4.就地複製和清零對於通用就地刪除,維護兩個索引並分配不可刪除的元素,同時將刪除的元素空間清零:
以上是如何在 Go 循環中有效率地從切片中刪除元素?的詳細內容。更多資訊請關注PHP中文網其他相關文章!