Go 中的惯用拼接

2 for-loop go slice

我检查了现有的答案,但它与我的情况不相似。

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

问题:如果在 处找到要提取的元素0 indexindex-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)

icz*_*cza 5

切片表达式中的高索引是排他的

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

正确的切片表达式是:

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)