我想讓自己熟悉Go,所以試圖實現一些搜索功能,但是通過查看容器類型的文檔,沒有任何內置類型實現contains
方法。我錯過了什麼,如果不是,我怎麼去測試會員?我是否必須實現我自己的方法,或者我必須遍歷所有元素。如果這是如此,遺漏容器類型的基本方法的基本原理是什麼?Go中的容器類型
Q
Go中的容器類型
7
A
回答
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建議的,考慮第三方軟件包。有一些容器類型的流行和成熟的軟件包。
相關問題
- 1. java中的泛型類型的容器
- 2. Go中的int類型的最大值
- 3. 在Go中使用反射來檢查兼容類型
- 4. Go中的int數據類型
- 5. Go中的Pair/tuple數據類型
- 6. Go接口/容器使用
- 7. 將類型的泛型容器強制轉換爲繼承類型的容器?
- 8. SSE類型的容器
- 9. Go,init自定義類型
- 10. Go mgo get字段類型
- 11. 錯誤類型go lang
- 12. Go Relflect聲明類型struct
- 13. 如何在Go中定義自己的類型轉換器?
- 14. 基於Go中的接收器類型改變函數行爲
- 15. C++模板 - 指定容器類型和它容納的容器元素類型
- 16. C++中的多類型容器
- 17. XLD中的LLDB容器類型彙總
- 18. 在Go中強制映射類型
- 19. 在Go中爲變量指定類型
- 20. 在Go中使用函數類型
- 21. 在Go中解釋類型斷言
- 22. C++容器的繼承類的類型
- 23. 爲什麼沒有類型類型的容器類型?
- 24. 如何在容器類型爲Docker的Mesosphere中創建容器?
- 25. 聲明泛型類型對象go
- 26. 獲得容器類名(UIView的類型)
- 27. 從子類返回容器的類型
- 28. 容器元素類型
- 29. Bootstrap 3造型容器類
- 30. 如何在Go中使用HTML/TEMPLATE包時設置不同的內容類型
你在說什麼容器類型? –
正常列表 – cobie
這是標準的雙向鏈表。添加包含函數會誘使您認爲這可以高效完成。如果你想要的東西比迭代更有效,你可能需要另一種結構,也許是一張地圖。 –