golang gods使用

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
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
秋本酒美子的头像 - 鹿快
评论 抢沙发

请登录后发表评论

    暂无评论内容