包含切片的方法

在Go中是否有类似于slice.contains(object)方法的东西,而不必通过切片中的每个元素进行search?

Mostafa已经指出,这样的方法是微不足道的,而mkb给你一个提示,使用从sorting包中的二进制search。 但是,如果你要做很多这样的包含检查,你也可以考虑使用地图。

通过使用value, ok := yourmap[key] idiom来检查是否存在特定的映射关键字是微不足道的。 既然你对这个值不感兴趣,你也可以创build一个map[string]struct{} 。 在这里使用一个空的struct{}有一个好处,它不需要任何额外的空间,Go的内部映射types是针对这种types的值进行优化的。 因此, map[string] struct{}是Go世界中stream行的集合。

不,这样的方法不存在,但写的很简单:

 func contains(s []int, e int) bool { for _, a := range s { if a == e { return true } } return false } 

如果查找是代码的重要部分,则可以使用地图,但地图也会花费太多。

如果切片已sorting,则在sort包中执行二分search。

map可能是更好的解决scheme,而不是使用slice

简单的例子:

 package main import "fmt" func contains(slice []string, item string) bool { set := make(map[string]struct{}, len(slice)) for _, s := range slice { set[s] = struct{}{} } _, ok := set[item] return ok } func main() { s := []string{"a", "b"} s1 := "a" fmt.Println(contains(s, s1)) } 

http://play.golang.org/p/CEG6cu4JTf

您可以使用reflection包在具体types是切片的接口上进行迭代:

 func HasElem(s interface{}, elem interface{}) bool { arrV := reflect.ValueOf(s) if arrV.Kind() == reflect.Slice { for i := 0; i < arrV.Len(); i++ { // XXX - panics if slice element points to an unexported struct field // see https://golang.org/pkg/reflect/#Value.Interface if arrV.Index(i).Interface() == elem { return true } } } return false } 

https://play.golang.org/p/jL5UD7yCNq

不确定generics是需要在这里,你只需要一个合约,你想要的行为。 如果你想让你自己的对象在集合中performance自己,比如通过重载Equals()和GetHashCode()来做下面的事情。

 type Identifiable interface{ GetIdentity() string } func IsIdentical(this Identifiable, that Identifiable) bool{ return (&this == &that) || (this.GetIdentity() == that.GetIdentity()) } func contains(s []Identifiable, e Identifiable) bool { for _, a := range s { if IsIdentical(a,e) { return true } } return false }