2012-11-23 85 views
7

我想讓自己熟悉Go,所以試圖實現一些搜索功能,但是通過查看容器類型的文檔,沒有任何內置類型實現contains方法。我錯過了什麼,如果不是,我怎麼去測試會員?我是否必須實現我自己的方法,或者我必須遍歷所有元素。如果這是如此,遺漏容器類型的基本方法的基本原理是什麼?Go中的容器類型

+0

你在說什麼容器類型? –

+0

正常列表 – cobie

+2

這是標準的雙向鏈表。添加包含函數會誘使您認爲這可以高效完成。如果你想要的東西比迭代更有效,你可能需要另一種結構,也許是一張地圖。 –

回答

7

標準庫的容器類型要求您在抽出元素時輸入斷言。容器本身沒有辦法對會員進行測試,因爲他們不知道它們所包含的類型,也無法進行比較。

Ric Szopa的跳過列表實現可能就是您要找的。它有一個實現了Contains方法的Set類型。

https://github.com/ryszard/goskiplist

我一直在使用它在生產,我與它很高興。

+0

感謝編輯Stephen。類型斷言是正確的。這是一個看起來和學習的時刻。 :-) – Daniel

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) 
} 
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))時間內進行二進制搜索。

最後,正如Daniel建議的,考慮第三方軟件包。有一些容器類型的流行和成熟的軟件包。