在Golang中使用泛型实现“slice包含”检查函数


检查一个数组是否包含一个给定的值是一个流行的编程函数,在许多编程语言中都是原生实现的。
在Go中,我们必须自己实现它,但由于新的泛型功能,我们可以编写一个单一的contains()函数,它将适用于任何类型的slice,其值可以被比较。

package main

import "fmt"

func contains[T comparable](elems []T, v T) bool {
    for _, s := range elems {
        if v == s {
            return true
        }
    }
    return false
}

func main() {
    fmt.Println(contains([]string{
"a", "b", "c"}, "b"))
    fmt.Println(contains([]int{1, 2, 3}, 2))
    fmt.Println(contains([]int{1, 2, 3}, 10))
}

泛型函数的类型参数在函数名后面的方括号中声明。
在contains()中,我们使用了带有comparable约束的T类型参数。这是一个内置的约束,它描述了任何类型的值可以被比较,也就是说,我们可以对它们使用==和!=运算符。
该函数的主体其实很简单,与非通用版本没有区别。
我们在elems slice上迭代,检查当前值是否是我们要找的值v。这样,我们就得到了一个可以对任何片断类型进行操作的函数。

输出:

true
true
false