检查一个数组是否包含一个给定的值是许多编程语言中原生实现的一个流行的编程函数。在Go中,我们必须自己实现它,但由于新的泛型功能,我们可以编写一个单一的contains() ,该函数将适用于任何类型的切片,其值可以被比较。
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))
}
伴随着Go 1.18的发布,Go的
golang.org/x/exp/slices包也被发布了,其中的Contains()函数的工作原理和上面的一样。
正如你在我们之前的泛型教程中已经知道的,泛型函数的类型参数是在函数名称后面的方括号中声明的。在contains() 中,我们使用T 的类型参数与 comparable约束。它是一个内置的约束条件,描述了任何数值可以被比较的类型,也就是说,我们可以对它们使用== 和!= 操作符。该函数的主体其实很简单,与非通用版本没有区别。我们在elems slice上进行迭代,并检查当前值是否是我们正在寻找的值v 。这样,我们就得到了一个可以对任何片断类型进行操作的函数。
main() 函数的输出:
true
true
false