小编典典

前往:如果唯一则追加

go

有没有一种方法可以检查切片/映射中是否存在值?

只想 在切片中 存在值 时才 向切片添加值。

这可行,但似乎很冗长。有更好的方法吗?

orgSlice := []int{1, 2, 3}
newSlice := []int{}
newInt := 2

newSlice = append(newSlice, newInt)
for _, v := range orgSlice {
    if v != newInt {
        newSlice = append(newSlice, v)
    }
}

newSlice == [2 1 3]

阅读 182

收藏
2020-07-02

共1个答案

小编典典

您的方法将为每次插入花费线性时间。更好的方法是使用map[int]struct{}。另外,您也可以使用a
map[int]bool或类似名称,但是empty
struct{}的优点是它不占用任何额外空间。因此,map[int]struct{}是一组整数的普遍选择。

例:

set := make(map[int]struct{})
set[1] = struct{}{}
set[2] = struct{}{}
set[1] = struct{}{}
// ...

for key := range(set) {
  fmt.Println(key)
}
// each value will be printed only once, in no particular order


// you can use the ,ok idiom to check for existing keys
if _, ok := set[1]; ok {
  fmt.Println("element found")
} else {
  fmt.Println("element not found")
}
2020-07-02