Golang Go语言中开源一个泛型数据容器库

发布于 1周前 作者 nodeper 来自 Go语言

https://github.com/lxzan/dao

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 &gt;= 45 }).
	Right(func(key int) bool { return key &lt;= 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

1 回复

更多关于Golang Go语言中开源一个泛型数据容器库的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Golang社区中,开源一个泛型数据容器库是一个非常有价值的贡献。随着Go 1.18版本引入泛型支持,开发者们终于能够以更类型安全、更灵活的方式编写复用性更高的代码。以下是一些关于如何高效开源你的泛型数据容器库的建议:

  1. 明确目标与设计:首先,明确你的数据容器库要解决的问题和目标用户。是提供高性能的并发数据结构,还是简单易用的基础容器?设计时要充分考虑泛型的特性,确保API既灵活又易于使用。

  2. 实现与测试:在实现过程中,充分利用Go的泛型特性来减少代码重复,提高代码质量。同时,编写全面的单元测试,确保容器在各种情况下的正确性和性能。

  3. 文档与示例:良好的文档是开源项目成功的关键。为你的库编写清晰的文档,包括API说明、使用示例和性能分析。这些都将帮助用户更快地理解和使用你的库。

  4. 发布与宣传:在GitHub等平台发布你的库,并利用社交媒体、技术论坛和博客等渠道进行宣传。参与Go社区,回答用户问题,收集反馈并不断改进你的库。

  5. 持续维护:开源项目需要持续的维护和更新。随着Go语言和社区的发展,你的库也需要不断演进。定期发布新版本,修复bug,添加新功能,保持与Go社区的同步。

总之,开源一个泛型数据容器库是一个既挑战又充满机遇的过程。希望你的项目能够成为Go社区中的一颗璀璨明珠。

回到顶部