为了账号安全,请及时绑定邮箱和手机立即绑定

如何在golang的循环中删除struct数组的元素

如何在golang的循环中删除struct数组的元素

Go
智慧大石 2021-09-20 21:00:13
问题我有结构数组:type Config struct {  Applications []Application}注意:Config - 是 json.Decode 的结构体。config = new(Config)_ = decoder.Decode(&config)在循环中,我通过键删除了一些条件和元素。for i, application := range config.Applications {  if i == 1 {    config.Applications = _removeApplication(i, config.Applications)  }}func _removeApplication(i int, list []Application) []Application {  if i < len(list)-1 {    list = append(list[:i], list[i+1:]...)  } else {    log.Print(list[i].Name)    list = list[:i]  }  return list}但我总是有“超出范围”的错误。从结构数组中逐键删除元素的最佳方法是什么?
查看完整描述

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:]...)

    }

}


查看完整回答
反对 回复 2021-09-20
?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

您收到此错误是因为您正在对初始范围为 X 长度的切片进行循环,该范围变为 Xn,因为您在循环期间删除了一些元素。

如果要从切片中删除特定索引处的项目,可以这样做:

sliceA = append(sliceA[:indexOfElementToRemove], sliceA[indexOfElementToRemove+1:]...)


查看完整回答
反对 回复 2021-09-20
?
陪伴而非守候

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

}


查看完整回答
反对 回复 2021-09-20
  • 3 回答
  • 0 关注
  • 1914 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信