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