Golang Go语言中开源一个泛型数据容器库
DAO 是一个基于泛型的数据结构与算法库, 旨在补充标准库在数据容器和算法方面的不足, 简化业务开发.
Features
简单介绍下一些特色数据容器
Vector
为简化 CRUD 而开发的容器, 使用带接口约束泛型, 部分弥补了 Go 不支持泛型方法的不足
package main
import (
“fmt”
“github.com/lxzan/dao/vector”
“time”
)
type User struct {
ID int64
Name string
CreatedAt time.Time
UpdatedAt time.Time
}
func (u *User) GetID() int64 {
return u.ID
}
func main() {
var docs = vector.NewFromDocs[int64, *User](
&User{ID: 1, Name: “ming”},
&User{ID: 3, Name: “hong”},
&User{ID: 3, Name: “hong”},
&User{ID: 4, Name: “mei”},
&User{ID: 4, Name: “mei”},
)
docs.
Unique().
Filter(func(i int, v *User) bool {
return v.ID%2 == 1
}).
Range(func(i int, v *User) bool {
fmt.Printf(“id=%d, name=%s\n”, v.ID, v.Name)
return true
})
}
IndexedHeap
N 叉索引堆, 在普通堆的基础上拓展了更新和删除方法.
package main
import (
“github.com/lxzan/dao/heap”
“github.com/lxzan/dao/types/cmp”
)
func main() {
var h = heap.NewIndexedHeap[int, string](heap.Quadratic, cmp.Less[int])
h.Push(1, “”)
h.Push(3, “”)
h.Push(5, “”)
var node = h.Push(2, “”)
h.Push(4, “”)
h.Push(6, “”)
h.DeleteByIndex(node.Index())
for h.Len() > 0 {
println(h.Pop().Key())
}
}
Deque
高性能双端队列, 基于数组实现, 使用数据索引模拟指针. Deque 内部不包含任何指针, 删除的槽位内存可复用, 不依赖 sync.Pool.
package main
import (
“fmt”
“github.com/lxzan/dao/deque”
)
func main() {
var q = deque.Deque[int]{}
q.PushBack(1)
q.PushBack(3)
q.PushBack(5)
q.PushBack(7)
q.PushBack(9)
for i := q.Front(); i != nil; i = q.Get(i.Next()) {
fmt.Printf("%d ", i.Value())
}
fmt.Printf("\n")
for i := q.Back(); i != nil; i = q.Get(i.Prev()) {
fmt.Printf("%d ", i.Value())
}
}
红黑树
高性能红黑树实现, 从 nginx 移植而来.
package main
import (
“github.com/lxzan/dao/rbtree”
)
func main() {
var tree = rbtree.Newint, struct{}
for i := 0; i < 100; i++ {
tree.Set(i, struct{}{})
}
var results = tree.
NewQuery().
Left(func(key int) bool { return key >= 45 }).
Right(func(key int) bool { return key <= 65 }).
Limit(5).
Offset(5).
Order(rbtree.DESC).
FindAll()
for _, item := range results {
println(item.Key)
}
}
Golang Go语言中开源一个泛型数据容器库
更多关于Golang Go语言中开源一个泛型数据容器库的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于Golang Go语言中开源一个泛型数据容器库的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Golang社区中,开源一个泛型数据容器库是一个非常有价值的贡献。随着Go 1.18版本引入泛型支持,开发者们终于能够以更类型安全、更灵活的方式编写复用性更高的代码。以下是一些关于如何高效开源你的泛型数据容器库的建议:
-
明确目标与设计:首先,明确你的数据容器库要解决的问题和目标用户。是提供高性能的并发数据结构,还是简单易用的基础容器?设计时要充分考虑泛型的特性,确保API既灵活又易于使用。
-
实现与测试:在实现过程中,充分利用Go的泛型特性来减少代码重复,提高代码质量。同时,编写全面的单元测试,确保容器在各种情况下的正确性和性能。
-
文档与示例:良好的文档是开源项目成功的关键。为你的库编写清晰的文档,包括API说明、使用示例和性能分析。这些都将帮助用户更快地理解和使用你的库。
-
发布与宣传:在GitHub等平台发布你的库,并利用社交媒体、技术论坛和博客等渠道进行宣传。参与Go社区,回答用户问题,收集反馈并不断改进你的库。
-
持续维护:开源项目需要持续的维护和更新。随着Go语言和社区的发展,你的库也需要不断演进。定期发布新版本,修复bug,添加新功能,保持与Go社区的同步。
总之,开源一个泛型数据容器库是一个既挑战又充满机遇的过程。希望你的项目能够成为Go社区中的一颗璀璨明珠。