我正在尝试熟悉Go,因此尝试实现一些搜索功能,但查看容器类型的文档,内置类型都没有实现contains
方法。我错过了什么,如果不是我如何测试会员资格?我是否必须实现自己的方法,或者我必须遍历所有元素。如果是这样的话,为容器类型省略这种基本方法背后的理由是什么呢?
答案 0 :(得分:7)
标准库的容器类型要求您在拉出元素时键入断言。容器本身无法对成员资格进行测试,因为他们不知道他们所包含的类型,也无法进行比较。
Ric Szopa的跳过列表实现可能正是您正在寻找的。它有一个Set类型,它实现了Contains方法。
https://github.com/ryszard/goskiplist
我一直在制作中使用它并且对它非常满意。
答案 1 :(得分:4)
地图是一种内置类型,它有一个“包含”结构,而不是一种方法。
http://play.golang.org/p/ddpmiskxqS
package main
import (
"fmt"
)
func main() {
a := map[string]string{"foo": "bar"}
_, k := a["asd"]
fmt.Println(k)
_, k = a["foo"]
fmt.Println(k)
}
答案 2 :(得分:3)
使用容器/列表包,您可以编写自己的循环来搜索事物。在包中没有提供这个的原因可能就像Dystroy说的那样,会隐藏O(n)操作。
您无法添加方法,因此您只需编写一个循环。
for e := l.Front(); e != nil; e = e.Next() {
data := e.Value.(dataType) // type assertion
if /* test on data */ {
// do something
break
}
}
这很简单,O(n)的复杂性是显而易见的。
在您对Go提供的支持搜索的数据结构的审核中,请不要错过排序包。那里的函数允许在O(n log(n))中对切片进行排序,然后在O(log(n))时间内进行二进制搜索。
最后,丹尼尔建议,考虑第三方包。容器类型有一些流行的和成熟的包。