首页 > 后端开发 > Golang > 正文

如何从 Go 循环内的切片中删除元素:最佳实践是什么?

Mary-Kate Olsen
发布: 2024-10-28 05:01:30
原创
189 人浏览过

How to Remove Elements from a Slice Within a Loop in Go: What Are the Best Practices?

删除循环内的切片元素

从循环内的切片中有效删除元素可能很棘手。一种不正确但常见的方法是在基于范围的循环中使用追加:

<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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!