gods(Go Data Structures)是一个 第三方泛型数据结构库,为 Go 语言提供了丰富、类型安全、高性能的集合和容器实现。它弥补了标准库 container 包功能有限、缺乏泛型(在 Go 1.18 之前)以及使用不便的问题。
GitHub 地址:https://github.com/emirpasic/gods
⚠️ 注意:虽然项目名是 gods,但它与 Go 官方无关,是社区维护的开源库。
✅ 为什么使用 gods?
- 泛型支持(Go 1.18+):类型安全,无需类型断言。
- 丰富的数据结构:远超标准库 container。
- 清晰的接口设计:统一的操作方法(如 Add, Remove, Contains 等)。
- 高性能实现:多数结构基于 slice、map 或红黑树等高效底层结构。
- 线程不安全但可扩展:适合单 goroutine 使用,或自行加锁。
支持的主要数据结构
1. Lists(列表)
- arraylist.ArrayList[T]:基于动态数组(类似 slice,但封装为对象)
- singlylinkedlist.SinglyLinkedList[T]
- doublylinkedlist.DoublyLinkedList[T]
2. Sets(集合)
- treeset.TreeSet[T]:基于红黑树,元素有序
- hashset.HashSet[T]:基于 map,无序但 O(1) 查找
- linkedhashset.LinkedHashSet[T]:保持插入顺序
3. Maps(映射)
- treemap.TreeMap[K, V]:键有序
- hashmap.HashMap[K, V]:无序,高性能
- linkedhashmap.LinkedHashMap[K, V]:保持插入顺序
4. Stack & Queue(栈和队列)
- stack.Stack[T]:基于 list 实现
- queue.Queue[T]:FIFO 队列
- priorityqueue.PriorityQueue[T]:基于堆(需提供比较器)
5. Trees(树)
- redblacktree.RedBlackTree[K, V]:自平衡二叉搜索树
- btree.BTree(多路搜索树,适合磁盘存储场景)
6. Others
- utils.Comparator:用于自定义排序逻辑
- 迭代器(Iterator)支持:Each, Map, Select, Any, All 等函数式操作
快速示例
安装
go get github.com/emirpasic/gods/v2
注意:v2 是泛型版本(Go 1.18+),旧版 v1 使用 interface{}。
示例 1:使用 ArrayList
import "github.com/emirpasic/gods/v2/lists/arraylist"
list := arraylist.New[int]()
list.Add(1, 2, 3)
list.Remove(1) // 删除索引 1 的元素
fmt.Println(list) // [1, 3]
示例 2:使用 TreeSet(自动排序)
import "github.com/emirpasic/gods/v2/sets/treeset"
set := treeset.NewWith[int](func(a, b int) int {
if a < b {
return -1
} else if a > b {
return 1
}
return 0
})
set.Add(3, 1, 4, 1, 5)
fmt.Println(set.Values()) // [1 3 4 5]
示例 3:使用 HashMap
import "github.com/emirpasic/gods/v2/maps/hashmap"
m := hashmap.New[string, int]()
m.Put("apple", 5)
m.Put("banana", 3)
val, ok := m.Get("apple")
if ok {
fmt.Println(val) // 5
}
示例 4:函数式遍历
list:= arraylist.New(1, 2, 3, 4)
even := list.Select(func(index int, value int) bool {
return value%2 == 0
})
fmt.Println(even.Values()) // [2, 4]
与标准库 container 对比
|
特性 |
container (标准库) |
gods (第三方) |
|
泛型支持 |
❌(存 interface{} ) |
✅(Go 1.18+ 泛型) |
|
数据结构种类 |
3 种(list/ring/heap) |
10+ 种(set/map/tree/stack 等) |
|
类型安全 |
❌ 需类型断言 |
✅ 编译期检查 |
|
性能 |
一般 |
优化良好 |
|
社区活跃度 |
官方维护,稳定但功能少 |
活跃(v2 专为泛型重构) |
|
学习成本 |
低 |
中等(需熟悉接口) |
⚠️ 注意事项
不是并发安全的:多 goroutine 访问需自行加锁(如 sync.RWMutex)。
依赖比较器:对于自定义类型(如 struct),需提供 Comparator 函数。
type Person struct { Name string; Age int }
comparator := func(a, b Person) int {
if a.Age < b.Age { return -1 }
if a.Age > b.Age { return 1 }
return 0
}
tree := redblacktree.NewWith(comparator)
包体积:作为第三方依赖会增加二进制大小,但一般可接受。
✅ 适用场景
- 需要 有序集合(TreeSet/TreeMap)
- 需要 类型安全的链表、栈、队列
- 实现 算法题(如图、堆、并查集等)
- 替代频繁的 []T + 手动去重/查找逻辑
© 版权声明
文章版权归作者所有,未经允许请勿转载。如内容涉嫌侵权,请在本页底部进入<联系我们>进行举报投诉!
THE END


















暂无评论内容