数据质量开源框架,爱上开源之底层两个数据结构
数据质量开源框架,爱上开源之底层两个数据结构fasthttp这个项目非常的值得借鉴,虽然只是在http这块著名,但是其中的一些思想和实现方式,都被很多的网络通信的项目所借鉴, 包括一些golang net通信这块颇有名气的一些项目,查看他们的底层代码,实现都是借用fasthttp的方式。这两个数据结构的实现,已经单独为一个项目,项目地址在 github.com/gohutool/ 
第一个是环形队列, 在无锁队列里最有名的就是Disruptor,他的背景感兴趣的话,大家可以去网上百科一下, 他的数据结构就是用环形队列实现的。

我们这里是最简单的一个环形队列的实现, 当然这里没有实现的像disruptor那么复杂。

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/




