3 回答
TA贡献1856条经验 获得超11个赞
从Slice Tricks页面引用删除 index 处的元素i:
a = append(a[:i], a[i+1:]...)
// or
a = a[:i+copy(a[i:], a[i+1:])]
请注意,如果您计划从当前循环的切片中删除元素,则可能会导致问题。如果您删除的元素是当前元素(或已循环的前一个元素),则它会这样做,因为删除后所有后续元素都被移位,但range循环不知道这一点,并且仍会增加索引并且您跳过一个元素.
您可以通过使用向下循环来避免这种情况:
for i := len(config.Applications) - 1; i >= 0; i-- {
application := config.Applications[i]
// Condition to decide if current element has to be deleted:
if haveToDelete {
config.Applications = append(config.Applications[:i],
config.Applications[i+1:]...)
}
}
TA贡献1895条经验 获得超7个赞
您收到此错误是因为您正在对初始范围为 X 长度的切片进行循环,该范围变为 Xn,因为您在循环期间删除了一些元素。
如果要从切片中删除特定索引处的项目,可以这样做:
sliceA = append(sliceA[:indexOfElementToRemove], sliceA[indexOfElementToRemove+1:]...)
TA贡献1757条经验 获得超8个赞
这个问题有点老了,但我还没有在 StackOverflow 上找到另一个答案,其中提到了Slice Tricks 中用于过滤列表的以下技巧:
b := a[:0]
for _, x := range a {
if f(x) {
b = append(b, x)
}
}
因此,在这种情况下,删除某些元素的函数可能如下所示:
func removeApplications(apps []Applications) []Applications {
filteredApps := apps[:0]
for _, app := apps {
if !removeApp {
filteredApps = append(filteredApps, app)
}
}
return filteredApps
}
- 3 回答
- 0 关注
- 1914 浏览
添加回答
举报