”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 如何在 Go 中迭代地从切片中删除元素?

如何在 Go 中迭代地从切片中删除元素?

发布于2024-11-07
浏览:918

How to Remove Elements from a Slice Iteratively in Go?

迭代地从切片中删除元素

迭代切片时,由于移动而在循环中删除元素可能会很棘手后续元素。一种常见的错误方法是使用追加来删除元素,如下例所示:

a := []string{"abc", "bbc", "aaa", "aoi", "ccc"}
for i := range a { // BAD
    if conditionMeets(a[i]) {
        a = append(a[:i], a[i 1:]...)
    }
}

此方法无法正常工作,因为循环不考虑移位的元素。要在迭代时正确删除元素,您可以使用向下循环或采用避免不断复制操作的替代方法。

向下循环

向下循环迭代相反的顺序,从最后一个元素开始。这种方法允许您删除元素,而无需手动递减循环变量:

a := []string{"abc", "bbc", "aaa", "aoi", "ccc"}
for i := len(a) - 1; i >= 0; i-- {
    if conditionMeets(a[i]) {
        a = append(a[:i], a[i 1:]...)
    }
}

多次删除的替代方法

如果需要删除大量元素,由于复制过多,使用追加可能效率低下。另一种方法是创建一个新切片并仅复制不可移动元素:

a := []string{"abc", "bbc", "aaa", "aoi", "ccc"}
b := make([]string, len(a))
copied := 0
for _, s := range(a) {
    if !conditionMeets(s) {
        b[copied] = s
        copied  
    }
}
b = b[:copied]

多次删除的就地删除(通用)

就地删除技术涉及维护两个索引并分配非同一切片中的可移除元素,同时将已移除元素位置清零:

a := []string{"abc", "bbc", "aaa", "aoi", "ccc"}
copied := 0
for i := 0; i 
最新教程 更多>

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3