刪除循環內的切片元素
從循環內的切片中有效刪除元素可能很棘手。一種不正確但常見的方法是在基於範圍的循環中使用追加:
<code class="go">for i := range a { // BAD if conditionMeets(a[i]) { a = append(a[:i], a[i+1:]...) } }</code>
但是,這種方法會導致循環變數不同步並跳過元素。
正確的基於循環的刪除
相反,請考慮在刪除元素後手動遞減循環變數:
<code class="go">for i := 0; i < len(a); i++ { if conditionMeets(a[i]) { a = append(a[:i], a[i+1:]...) i-- } }
向下循環多次刪除
如果可能需要刪除多個元素,向下循環可確保移位的元素保留在循環迭代之外:
<code class="go">for i := len(a) - 1; i >= 0; i-- { if conditionMeets(a[i]) { a = append(a[:i], a[i+1:]...) } }</code>
交替進行多次刪除
對於大量刪除,請考慮將不可刪除元素複製到新切片,從而避免大量複製操作:
<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>
循環就地刪除
要在-放置刪除,維護兩個索引,分配不可刪除的元素,同時將刪除的元素清除:
<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>
以上是如何從 Go 循環內的切片中刪除元素:最佳實踐是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!