Ado*_*lfo 272
从 Go 1.21 开始,您可以使用从前面提到的实验包升级的stdlibslices包。
import "slices"\n\nthings := []string{"foo", "bar", "baz"}\nslices.Contains(things, "foo") // true\nRun Code Online (Sandbox Code Playgroud)\n原答案:
\n从 Go 1.18 开始,您可以使用slices包 \xe2\x80\x93 特别是通用Contains函数:\n https://pkg.go.dev/golang.org/x/exp/slices#Contains。
go get golang.org/x/exp/slices\nRun Code Online (Sandbox Code Playgroud)\nimport "golang.org/x/exp/slices"\nRun Code Online (Sandbox Code Playgroud)\nthings := []string{"foo", "bar", "baz"}\nslices.Contains(things, "foo") // true\nRun Code Online (Sandbox Code Playgroud)\n请注意,由于这是一个实验包,位于 stdlib 之外,因此它不受 Go 1 兼容性 Promise\xe2\x84\xa2 的约束,并且在正式添加到 stdlib 之前可能会发生变化。
\ntux*_*21b 205
Mostafa已经指出这样的方法写起来很简单,而mkb给你一个提示,可以使用sort包中的二进制搜索.但是如果你打算做很多这样的包含检查,你也可以考虑使用地图.
通过使用value, ok := yourmap[key]成语来检查特定的地图密钥是否存在是微不足道的.由于您对该值不感兴趣,因此您也可以创建一个map[string]struct{}例如.struct{}在这里使用空的优点是它不需要任何额外的空间,并且Go的内部地图类型针对这种值进行了优化.因此,map[string] struct{}在Go世界中,套装是一种流行的选择.
Mos*_*afa 156
不,这种方法不存在,但写起来很简单:
func contains(s []int, e int) bool {
for _, a := range s {
if a == e {
return true
}
}
return false
}
Run Code Online (Sandbox Code Playgroud)
如果该查找是代码的重要部分,则可以使用地图,但地图也需要花费.
小智 57
在 Go 1.18+ 中,我们可以使用泛型。
func Contains[T comparable](s []T, e T) bool {
for _, v := range s {
if v == e {
return true
}
}
return false
}
Run Code Online (Sandbox Code Playgroud)
Hen*_*sen 16
该排序包提供了构建块,如果你的片进行排序,或者您愿意排序。
input := []string{"bird", "apple", "ocean", "fork", "anchor"}
sort.Strings(input)
fmt.Println(contains(input, "apple")) // true
fmt.Println(contains(input, "grow")) // false
...
func contains(s []string, searchterm string) bool {
i := sort.SearchStrings(s, searchterm)
return i < len(s) && s[i] == searchterm
}
Run Code Online (Sandbox Code Playgroud)
SearchString承诺 return the index to insert x if x is not present (it could be len(a)),因此检查它会显示字符串是否包含已排序的切片。
hol*_*lys 10
而不是使用slice,map可能是一个更好的解决方案.
简单的例子:
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))
}
Run Code Online (Sandbox Code Playgroud)
http://play.golang.org/p/CEG6cu4JTf
小智 8
func Contain(target interface{}, list interface{}) (bool, int) {
if reflect.TypeOf(list).Kind() == reflect.Slice || reflect.TypeOf(list).Kind() == reflect.Array {
listvalue := reflect.ValueOf(list)
for i := 0; i < listvalue.Len(); i++ {
if target == listvalue.Index(i).Interface() {
return true, i
}
}
}
if reflect.TypeOf(target).Kind() == reflect.String && reflect.TypeOf(list).Kind() == reflect.String {
return strings.Contains(list.(string), target.(string)), strings.Index(list.(string), target.(string))
}
return false, -1
}
Run Code Online (Sandbox Code Playgroud)
我认为map[x]bool比 更有用map[x]struct{}。
为地图中不存在的项目建立索引将返回false。所以_, ok := m[X]你可以直接说m[X].
这使得在表达式中嵌套包含测试变得容易。
小智 5
您可以使用Reflect包来迭代具体类型为切片的接口:
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
}
Run Code Online (Sandbox Code Playgroud)
https://play.golang.org/p/jL5UD7yCNq