gpt4 book ai didi

for-loop - Go 中的惯用拼接

转载 作者:IT王子 更新时间:2023-10-29 02:12:23 26 4
gpt4 key购买 nike

我检查了一个现有的 answer但这与我的情况不同。

我需要在索引处提取一个元素,并在运行时根据 Compare 函数跳出 for 循环。

问题:如果在 0 index 找到要提取的元素,index-1 将抛出范围错误的 slice 边界,如果 index+1 大于 len(elements)

问题:实现上述目标的最佳简洁方法是什么?

for index, element := range elements {
if element.Compare() == true {
elements = append(elements[:index-1], elements[index+1:]...)
break
}
}

尝试

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
}
}

尝试 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)

最佳答案

slice expression 中的高指数是排他性的

这意味着您的示例存在缺陷,并且不需要特殊处理。

正确的 slice 表达式是:

elements = append(elements[:index], elements[index+1:]...)

如果 index 是第一个元素 (0),则 elements[:0] 将是一个空 slice 。

如果index是最后一个元素(len-1),那么elements[index+1:]也将是一个空 slice ,因为 index+1 将等于 slice 的长度。所以解决方案很简单:

for index, element := range elements {
if element.Compare() {
elements = append(elements[:index], elements[index+1:]...)
break
}
}

为了在 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)
}

输出(在 Go Playground 上尝试):

0 : [1 2 3 4]
2 : [0 1 3 4]
4 : [0 1 2 3]

关于for-loop - Go 中的惯用拼接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42752500/

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