gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:04:57 25 4
gpt4 key购买 nike

问题

我有结构数组:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com