我检查了现有的答案,但它与我的情况不相似。
我需要在索引处提取一个元素,并for根据Compare函数在运行时跳出循环。
问题:如果在 处找到要提取的元素0 index,index-1则会抛出范围错误的切片边界,并且类似地,如果index+1大于len(elements)。
问题:实现上述目标的最佳简洁方法是什么?
for index, element := range elements {
if element.Compare() == true {
elements = append(elements[:index-1], elements[index+1:]...)
break
}
}
Run Code Online (Sandbox Code Playgroud)
试图
for index, element := range elements {
if element.Compare() == true {
if len(elements) > 1 {
elements = append(elements[:index-1], elements[index+1:]...)
} else if len(elements) == 1 {
delete(elements, 0)
}
break
}
}
Run Code Online (Sandbox Code Playgroud)
尝试 2 Playground有任何改进/建议吗?
这个想法是将剩余元素从开始复制到索引,然后复制后面的任何元素。
var elements = []string {"a", "b", "c", "d"}
fmt.Println(elements)
for index, element := range elements {
if element == "c" {
var temp = elements[:index]
for i := index + 1; i<len(elements); i++ {
temp = append(temp, elements[i])
}
elements = temp
break
}
}
fmt.Println(elements)
Run Code Online (Sandbox Code Playgroud)
切片表达式中的高索引是排他的。
这意味着您的示例有缺陷,并且不需要特殊处理。
正确的切片表达式是:
elements = append(elements[:index], elements[index+1:]...)
Run Code Online (Sandbox Code Playgroud)
如果index是第一个元素 ( 0),则将elements[:0]是一个空切片。
如果index是最后一个元素 ( len-1),则elements[index+1:]也将是一个空切片,因为index+1将等于切片的长度。所以解决方案很简单:
for index, element := range elements {
if element.Compare() {
elements = append(elements[:index], elements[index+1:]...)
break
}
}
Run Code Online (Sandbox Code Playgroud)
为了在 Go Playground 上演示它,我们Compare()用简单的索引检查来替换该方法:
for _, idxToRemove := range []int{0, 2, 4} {
s := []int{0, 1, 2, 3, 4}
for i := range s {
if i == idxToRemove {
s = append(s[:i], s[i+1:]...)
break
}
}
fmt.Println(idxToRemove, ":", s)
}
Run Code Online (Sandbox Code Playgroud)
输出(在Go Playground上尝试):
0 : [1 2 3 4]
2 : [0 1 3 4]
4 : [0 1 2 3]
Run Code Online (Sandbox Code Playgroud)