在 Go 列表中按值删除元素

Remove element by value in Go list

我有一个元素列表,我想按值删除其中一个。在 Python 这将是

l = ["apples", "oranges", "melon"]
l.remove("melon")
print(l) # ["apples", "orange"]

Go 中的等价物是什么?我找到了一个 slice trick 来通过索引删除一个元素,但它不是很可读,仍然需要我手动找到索引并且只适用于单个项目类型:

func remove(l []string, item string) {
    for i, other := range l {
        if other == item {
            return append(l[:i], l[i+1:]...)
        }
    }
}

list.List 结构,但它不是通用的,因此需要大量类型转换才能使用。

从列表中删除元素的惯用方法是什么?

从列表中删除元素的惯用方法是完全像您在示例中那样循环遍历它。从切片中按值删除元素在您的程序中不应该太常见,因为它是一个 O(n) 操作,并且语言中有更好的数据结构。因此,Go 没有为切片提供内置的 remove 函数。

如果您发现自己经常使用按值删除,请考虑改用集合,其中删除和添加元素 O(1) 同时仍可迭代。

set := map[string]bool{"apples":true, "oranges":true, "melon":true}
delete(set,"melon") // is O(1)

在通用 Go (1.18) 中,过滤器函数适用于任何 comparable 类型

func remove[T comparable](l []T, item T) []T {
    for i, other := range l {
        if other == item {
            return append(l[:i], l[i+1:]...)
        }
    }
    return l
}

在这里试试 https://go.dev/play/p/ojlYkvf5dQG?v=gotip