作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
问题
我有结构数组:
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/
我是一名优秀的程序员,十分优秀!