go 中没有提供类似于python中in
的功能。想要查看某元素是否在 slice 中,需要自己实现其功能。
1. 遍历
这是最先想到的方法。从slice 中取出每个成员,与被检测的元素进行比较。
func main() {
var fruits = []string{"apple", "banana", "orange", "pear"}
n := "pear"
for _, v := range fruits {
if n == v {
fmt.Println("in")
}
}
}
2. 借助 map
将 slice 中的成员当做 map 中的 key,利用 v, ok := map[key]
判断slice 中是否包含相关元素。
func main() {
var fruits = []string{"apple", "banana", "orange"}
n := "pear"
fm := make(map[string]int)
for i, v := range(fruits) {
fm[v] = i
}
if _, ok := fm[n]; ok {
fmt.Println("in")
} else {
fmt.Println("not in")
}
}
3. 借助 sort
包
import "sort"
func main() {
var fruits = []string{"orange", "apple", "banana","pear"}
n := "pear"
//对 slice 进行升序排序
ss := sort.StringSlice(fruits)
ss.Sort()
fruitsSorted := []string(ss)
//查找字符串
pos := sort.SearchStrings(fruitsSorted, n)
if pos != len(fruitsSorted) {
if n == fruitsSorted[pos] {
fmt.Println("in")
} else {
fmt.Println("not in")
}
} else {
fmt.Println("not in")
}
}
sort.SearchStrings()
:查找 string
sort.SearchInts()
:查找 int
sort.SearchFloat64s()
:查找 float64
使用 sort
包的注意事项:
- 查找之前需要对 slice 进行排序,而且必须是升序;
- 查找时,如果 slice 中存在元素,那么就返回元素在排序后的 slice中的索引;如果不存在,那么就返回 slice 的长度(
len(slice)
)。