删除循环内的切片元素
从循环内的切片中有效删除元素可能很棘手。一种不正确但常见的方法是在基于范围的循环中使用追加:
<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中文网其他相关文章!