猿问

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

问题


我有结构数组:


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

}

但我总是有“超出范围”的错误。从结构数组中逐键删除元素的最佳方法是什么?


智慧大石
浏览 1915回答 3
3回答

呼唤远方

从Slice Tricks页面引用删除 index 处的元素i:a = append(a[:i], a[i+1:]...)// ora = a[:i+copy(a[i:], a[i+1:])]请注意,如果您计划从当前循环的切片中删除元素,则可能会导致问题。如果您删除的元素是当前元素(或已循环的前一个元素),则它会这样做,因为删除后所有后续元素都被移位,但range循环不知道这一点,并且仍会增加索引并且您跳过一个元素.您可以通过使用向下循环来避免这种情况:for i := len(config.Applications) - 1; i >= 0; i-- {&nbsp; &nbsp; application := config.Applications[i]&nbsp; &nbsp; // Condition to decide if current element has to be deleted:&nbsp; &nbsp; if haveToDelete {&nbsp; &nbsp; &nbsp; &nbsp; config.Applications = append(config.Applications[:i],&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; config.Applications[i+1:]...)&nbsp; &nbsp; }}

人到中年有点甜

您收到此错误是因为您正在对初始范围为 X 长度的切片进行循环,该范围变为 Xn,因为您在循环期间删除了一些元素。如果要从切片中删除特定索引处的项目,可以这样做:sliceA&nbsp;=&nbsp;append(sliceA[:indexOfElementToRemove],&nbsp;sliceA[indexOfElementToRemove+1:]...)

陪伴而非守候

这个问题有点老了,但我还没有在 StackOverflow 上找到另一个答案,其中提到了Slice Tricks 中用于过滤列表的以下技巧:b := a[:0]for _, x := range a {&nbsp; &nbsp; if f(x) {&nbsp; &nbsp; &nbsp; &nbsp; b = append(b, x)&nbsp; &nbsp; }}因此,在这种情况下,删除某些元素的函数可能如下所示:func removeApplications(apps []Applications) []Applications {&nbsp; &nbsp; filteredApps := apps[:0]&nbsp; &nbsp; for _, app := apps {&nbsp; &nbsp; &nbsp; &nbsp; if !removeApp {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; filteredApps = append(filteredApps, app)&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; return filteredApps}
随时随地看视频慕课网APP

相关分类

Go
我要回答