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