切片循环内就地删除元素
问题:
访问切片元素从 i 范围内的 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-- } }
2.向下循环
或者,使用向下循环以避免手动递减:
<code class="go">for i := len(a) - 1; i >= 0; i-- { if conditionMeets(a[i]) { a = append(a[:i], a[i+1:]...) } }</code>
3.不可移除元素复制
如果需要移除的元素较多,可以考虑将不可移除元素复制到新切片以提高效率:
<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>
4.就地复制和清零
对于通用就地删除,维护两个索引并分配不可删除的元素,同时将删除的元素空间清零:
<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中文网其他相关文章!