Golang是否具有“如果x in”构造与Python类似?

没有迭代整个数组我怎么检查数组中的'X'在Go?

像Python: if "x" in array: ...

在Go中没有内置的操作符。 你需要遍历数组。 你可以编写自己的函数来做到这一点,就像这样:

 func stringInSlice(a string, list []string) bool { for _, b := range list { if b == a { return true } } return false } 

如果您希望能够检查成员资格而无需遍历整个列表,则需要使用映射而不是数组或片段,如下所示:

 visitedURL := map[string]bool { "http://www.google.com": true, "https://paypal.com": true, } if visitedURL[thisSite] { fmt.Println("Already been here.") } 

这是引自“编程在Go:为21世纪创build应用程序”的书:

像这样使用简单的线性search是未sorting数据的唯一select,适用于小片(高达数百个项目)。 但对于更大的切片,特别是如果我们重复执行search,线性search效率非常低,平均每次需要比较一半的项目。

Go提供了一个使用二分searchalgorithm的sort.Search()方法:这需要每次只比较log2(n)个项目(其中n是项目数量)。 从这个angular度来看,一个1000000个项目的线性search平均需要500000个比较,最坏的情况是1000000个比较; 二进制search最多需要20次比较,即使在最坏的情况下也是如此。

 files := []string{"Test.conf", "util.go", "Makefile", "misc.go", "main.go"} target := "Makefile" sort.Strings(files) i := sort.Search(len(files), func(i int) bool { return files[i] >= target }) if i < len(files) && files[i] == target { fmt.Printf("found \"%s\" at files[%d]\n", files[i], i) } 

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

另一个解决scheme,如果列表包含静态值。

例如:从有效值列表中检查有效值:

 func IsValidCategory(category string) bool { switch category { case "auto", "news", "sport", "music": return true } return false } 

上面使用sort的例子很接近,但是在string的情况下只需要使用SearchString:

 files := []string{"Test.conf", "util.go", "Makefile", "misc.go", "main.go"} target := "Makefile" sort.Strings(files) i := sort.SearchStrings(files, target) if i < len(files) && files[i] == target { fmt.Printf("found \"%s\" at files[%d]\n", files[i], i) } 

https://golang.org/pkg/sort/#SearchStrings

另一个select是使用地图作为一个集合。 你只需要使用这些键,并将其值设置为一个总是为真的布尔值。 然后,您可以轻松地检查地图是否包含密钥。 如果你需要一个集合的行为,这是很有用的,如果你多次添加一个值,那么它只在集合中一次。

这里有一个简单的例子,我添加随机数字作为地图的关键字。 如果同一个号码不止一次生成无关紧要,它只会出现在最终的地图中一次。 然后我使用一个简单的检查来查看是否有一个键在地图中。

 package main import ( "fmt" "math/rand" ) func main() { var MAX int = 10 m := make(map[int]bool) for i := 0; i <= MAX; i++ { m[rand.Intn(MAX)] = true } for i := 0; i <= MAX; i++ { if _, ok := m[i]; ok { fmt.Printf("%v is in map\n", i) } else { fmt.Printf("%v is not in map\n", i) } } } 

这是在操场上