arrays - 如何在golang的循环中删除结构数组的元素

标签 arrays struct go slice

问题

我有结构数组:

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
}

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

最佳答案

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

a = append(a[:i], a[i+1:]...)
// or
a = a[:i+copy(a[i:], a[i+1:])]

请注意,如果您打算从当前循环的 slice 中删除元素,则可能会导致问题。如果您删除的元素是当前元素(或已循环的前一个元素),它会这样做,因为删除后所有后续元素都会移动,但 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:]...)
    }
}

关于arrays - 如何在golang的循环中删除结构数组的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29005825/

相关文章:

c - 如何直接将结构体赋值给数组?

go - 使用 reflect 模拟 struct.field

types - slice 类型

java - int 数组到 ArrayList 的转换

Objective-C、C 类型数组和 OpenGL ES 2.0

c - 使两个结构指针相等

Golang struct 构造通用性

Ruby 标签列表到流畅的正则表达式

java - 比较和删除列表和数组java中不存在的元素

struct - 在 Julia 中实现相互嵌套结构的问题