gpt4 book ai didi

go - 删除 slice 中的元素

转载 作者:IT王子 更新时间:2023-10-29 00:50:26 25 4
gpt4 key购买 nike

我是 Golang 的新手,我正在尝试根据另一个 slice 中的元素删除一个 slice 中的元素。例如

输入 slice :urlList := []string{"test", "abc", "def", "ghi"

删除 slice 的元素:remove := []string{"abc", "test"}

预期输出 slice :urlList := []string{"def", "ghi"}

这是我试过的。

func main() {

urlList := []string{"test", "abc", "def", "ghi"}
remove := []string{"abc", "test"}
loop:
for i, url := range urlList {
for _, rem := range remove {
if url == rem {
urlList = append(urlList[:i], urlList[i+1:]...)
continue loop
}
}
}
for _, v := range urlList {
fmt.Println(v)
}
}

但它并没有像我预期的那样工作。我不知道我错过了什么。

最佳答案

问题在于,当您从原始列表中删除一个元素时,所有后续元素都会移位。但是 range 循环并不知道你改变了底层的 slice 并且会像往常一样增加索引,即使在这种情况下它不应该因为你跳过元素。

由于 remove 列表包含 2 个元素,它们在原始列表中彼此相邻,因此第二个元素 ("abc" 在这种情况下)不会被检查,也不会被删除。

一个可能的解决方案是不在外循环中使用range,当你删除一个元素时,你手动减少索引i-- 因为继续下一次迭代它将自动递增:

urlList := []string{"test", "abc", "def", "ghi"}
remove := []string{"abc", "test"}

loop:
for i := 0; i < len(urlList); i++ {
url := urlList[i]
for _, rem := range remove {
if url == rem {
urlList = append(urlList[:i], urlList[i+1:]...)
i-- // Important: decrease index
continue loop
}
}
}

fmt.Println(urlList)

输出:

[def ghi]

注意:

由于内循环之后外循环不包含任何内容,您可以用简单的 break 替换 label+continue :

urlList := []string{"test", "abc", "def", "ghi"}
remove := []string{"abc", "test"}

for i := 0; i < len(urlList); i++ {
url := urlList[i]
for _, rem := range remove {
if url == rem {
urlList = append(urlList[:i], urlList[i+1:]...)
i-- // Important: decrease index
break
}
}
}

fmt.Println(urlList)

试试Go Playground .

备选

另一种方法是让外部循环向下循环,因此无需手动减少(或增加)索引变量,因为移位的元素不受影响(由于向下方向已被处理)。

关于go - 删除 slice 中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28699485/

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