Go中的容器类型

时间:2012-11-23 21:55:55

标签: algorithm data-structures go containers

我正在尝试熟悉Go,因此尝试实现一些搜索功能,但查看容器类型的文档,内置类型都没有实现contains方法。我错过了什么,如果不是我如何测试会员资格?我是否必须实现自己的方法,或者我必须遍历所有元素。如果是这样的话,为容器类型省略这种基本方法背后的理由是什么呢?

3 个答案:

答案 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))时间内进行二进制搜索。

最后,丹尼尔建议,考虑第三方包。容器类型有一些流行的和成熟的包。