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

Ale*_*tau 16 arrays struct go slice

问题

我有一些结构:

type Config struct {
  Applications []Application
}
Run Code Online (Sandbox Code Playgroud)

注意:Config - 是json.Decode的结构.

config = new(Config)
_ = decoder.Decode(&config)
Run Code Online (Sandbox Code Playgroud)

在循环中,我有一些条件和按键删除元素.

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
}
Run Code Online (Sandbox Code Playgroud)

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

icz*_*cza 37

Slice Tricks页面引用,删除索引处的元素i:

a = append(a[:i], a[i+1:]...)
// or
a = a[:i+copy(a[i:], a[i+1:])]
Run Code Online (Sandbox Code Playgroud)

请注意,如果您计划从当前正在循环的切片中删除元素,则可能会导致问题.如果你删除的元素是当前元素(或者已经循环的前一个元素),它会发生这种情况,因为在删除之后所有后续元素都会被移位,但是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:]...)
    }
}
Run Code Online (Sandbox Code Playgroud)


gdg*_*gdg 6

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

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

sliceA = append(sliceA[:indexOfElementToRemove], sliceA[indexOfElementToRemove+1:]...)
Run Code Online (Sandbox Code Playgroud)