最简单的环形队列
func TestNewLoopQueue(t *testing.T) {
size := 100
q := NewLoopQueue(size, 1)
t.Logf("IsEmpty : %v", q.IsEmpty())
t.Logf("Len : %v", q.Len())
t.Logf("Detach : %v", q.Detach())
var i = 1
q.Insert(&i)
t.Logf("IsEmpty : %v", q.IsEmpty())
t.Logf("Len : %v", q.Len())
o := q.Get()
t.Logf("Get : %v", *o)
*o = 11
t.Logf("IsEmpty : %v", q.IsEmpty())
t.Logf("Len : %v", q.Len())
t.Logf("Detach : %v", *q.Detach())
t.Logf("IsEmpty : %v", q.IsEmpty())
t.Logf("Len : %v", q.Len())
}
最简单的stack
func TestNewStack(t *testing.T) {
size := 100
q := NewStack(size, 1)
t.Logf("IsEmpty : %v", q.IsEmpty())
t.Logf("Len : %v", q.Len())
t.Logf("Detach : %v", q.Detach())
var i = 1
q.Insert(&i)
t.Logf("IsEmpty : %v", q.IsEmpty())
t.Logf("Len : %v", q.Len())
o := q.Get()
t.Logf("Get : %v", *o)
*o = 11
t.Logf("IsEmpty : %v", q.IsEmpty())
t.Logf("Len : %v", q.Len())
t.Logf("Detach : %v", *q.Detach())
t.Logf("IsEmpty : %v", q.IsEmpty())
t.Logf("Len : %v", q.Len())
}
实现上,借鉴了fasthttp, 在其基础上,使用了泛型,原有的实现,对象都是使用interface{}和any保存对象的。 interface{}的方式,在获取的时候,必须进行造型,这样会有一定的开销,在这里实现上进行了优化,对算法也进行了一定的优化, 所有的优化目的都是以性能为目标,仅可能在各个细节上都提高性能。
fasthttp这个项目非常的值得借鉴,虽然只是在http这块著名,但是其中的一些思想和实现方式,都被很多的网络通信的项目所借鉴, 包括一些golang net通信这块颇有名气的一些项目,查看他们的底层代码,实现都是借用fasthttp的方式。
这两个数据结构的实现,已经单独为一个项目,项目地址在 github.com/gohutool/