为了方便对比,单协程中使用ArrayList和多协程中ArrayListConcurrent放在一起。
package code import "sync" type Array interface { Ini(); Add(interface{}) bool; Contains(interface{}) int; Size() int; Get(int) interface{}; Remove(int) interface{}; RemoveO(interface{}) bool; } type ArrayList struct { Data []interface{}; } func (this *ArrayList)Ini() { this.Data=make([]interface{},0); } func (this *ArrayList) Add (i interface{}) bool { this.Data= append (this.Data, i); return true; } //判断是否保存对象 -1 表示没有对象 func (this *ArrayList) Contains(i interface{}) int { var r int =-1; out:for k,v:=range this.Data { if(v==i){ r=k; break out; } } return r; } func (this *ArrayList) Size() int { return len(this.Data); } func (this *ArrayList) Get(index int) interface{} { var r interface{}= nil ; if(index>=0 && index<len(this.Data)){ r=this.Data[index]; } return r; } // 索引 删除 func (this *ArrayList) Remove(index int) interface{} { var r interface{}=nil; if(index>=0 && index<len(this.Data)){ if(index==0) { r=this.Data[index]; this.Data = this.Data[1:len(this.Data)] }else if(index==(len(this.Data)-1)){ r=this.Data[index]; this.Data = this.Data[0:len(this.Data)-1] }else { r=this.Data[index]; this.Data=append(this.Data[0:index],this.Data[index+1:len(this.Data)]...); } } return r; } //对象删除 func (this *ArrayList) RemoveO(i interface{}) bool { var r int=-1; out:for k,v:=range this.Data { if(v==i){ r=k; break out; } } if(r>=0) { this.Remove(r); return true; }else { return false; } } //并发对象 type ArrayListConcurrent struct { Data []interface{}; Lock *sync.Mutex } func (this *ArrayListConcurrent)Ini() { this.Data=make([]interface{},0); this.lock=new(sync.Mutex); } func (this *ArrayListConcurrent) Add (i interface{}) bool { this.lock.Lock(); this.Data=append(this.Data, i); this.lock.Unlock(); return true; } //判断是否保存对象 -1 表示没有对象 func (this *ArrayListConcurrent) Contains(i interface{}) int { var r int =-1; this.lock.Lock(); out:for k,v:=range this.Data { if(v==i){ r=k; break out; } } this.lock.Unlock(); return r; } func (this *ArrayListConcurrent) Size() int { return len(this.Data); } func (this *ArrayListConcurrent) Get(index int) interface{} { var r interface{}=nil; this.lock.Lock(); if(index>=0 && index<len(this.Data)){ r=this.Data[index]; } this.lock.Unlock(); return r; } //索引删除 func (this *ArrayListConcurrent) Remove(index int) interface{} { var r interface{}=nil; if(index>=0 && index<len(this.Data)){ this.lock.Lock(); if(index==0) { r=this.Data[index]; this.Data = this.Data[1:len(this.Data)] }else if(index==(len(this.Data)-1)){ r=this.Data[index]; this.Data = this.Data[0:len(this.Data)-1] }else { r=this.Data[index]; this.Data=append(this.Data[0:index],this.Data[index+1:len(this.Data)]...); } this.lock.Unlock(); } return r; } //对象删除 func (this *ArrayListConcurrent) RemoveO(i interface{}) bool { var b bool=false; this.lock.Lock(); var index int=-1; out:for k,v:=range this.Data { if(v==i){ index=k; break out; } } if(index>=0) { if(index==0) { this.Data = this.Data[1:len(this.Data)] }else if(index==(len(this.Data)-1)){ this.Data = this.Data[0:len(this.Data)-1] }else { this.Data=append(this.Data[0:index],this.Data[index+1:len(this.Data)]...); } b=true; } this.lock.Unlock() return b; }