浅谈去片高级实践

  

去语言切片是对数组的抽象。

  

去数组的长度不可改变,在特定场景中这样的集合就不太适用,去中提供了一种灵活,功能强悍的内置类型切片(“动态数组”),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。

  

<强>定义切片
  

  

你可以声明一个未指定大小的数组来定义切片:

        var标识符[]类型      

切片不需要说明长度。

  

或使用使()函数来创建切片:

        var slice1 [] type=使([]类型,len)      

也可以简写为

        slice1:=([]类型,len)      

也可以指定容量,其中能力为可选参数。

        使([]T、长度、容量)      

这里len是数组的长度并且也是切片的初始长度。

  

以下用法中,类型均使用int64做为示例,不处理接口。
  

  

代码只是展示实现思路,不一定完善。
  

  

<强>合并两个有序切片,新切片仍然有序
  

        func MergeSortedSlice (s1, s2 [] int64) [] int64 {//从末尾元素开始遍历   我:=len (s1) - 1   j:=len (s2) - 1//合并后的长度   newLen: len (s1) +兰=(s2)//合并后的索引,也从末尾元素开始   newIdx:=newLen - 1//创建一个新切片,代表合并后的   新闻:=([]int64 newLen)//将s1的内容拷贝到新切片   对于k、v:=范围s1 {   新闻[k]=v   }//开始遍历   我在=0,,j在=0 {//新元素   var newNum int64//将较大的值赋给新元素,同时向前移动指针   如果新闻[我]比;s2 [j] {   newNum=新闻[我]   我——   其他}{   newNum=s2 [j]   j——   }   [newIdx]=newNum新闻   newIdx——   }//如果s2还有剩余元素,则剩余元素一定都是最小的,直接放到头部即可   j在=0 {   新闻[newIdx]=s2 [j]   j——   newIdx——   }   返回消息   }   之前      

<强>根据特定规则过滤元素
  

        func FilterSlice (s [] int64、过滤func (x int64) bool) [] int64 {//返回的新切片//s[: 0]这种写法是创建了一个兰为0,上限为len (s)即和原始切片最大容量一致的切片//因为是过滤,所以新切片的元素总个数一定不大于比原始切片,这样做减少了切片扩容带来的影响//同时,也有一个问题,因为新闻和共享底层数组,那么过滤后年代也会被修改!   新闻:=s [: 0)//遍历,对每个元素执行过滤器,符合条件的加入新切片中   _,x:=s{范围   如果!过滤器(x) {   新闻=append(新闻,x)   }   }   返回消息   }   之前      

<强>去重
  

  

两种思路,循环顺序查找和使用地图加快查找(引入一个地图在各方面也是有开销的)。选用哪种,可以通过具体场景的基准决定
  

        func RemoveDuplicates (s [] int64) [] int64 {   var ret [] int64   _,v:=s{范围   发现:=false   _,v2:=范围ret {   如果v==v2 {   发现=true   打破   }   }   如果{发现!   ret=append (ret, v)   }   }   返回受潮湿腐烂   }      func RemoveDuplicates2 (s [] int64) [] int64 {   ret:=s [: 0)//利用结构体{}{}减少内存占用   协助:=地图(int64)结构{}{}   _,v:=s{范围   如果_,好的:=帮助[v];!好{   协助[v]=struct {} {}   ret=append (ret, v)   }   }   返回受潮湿腐烂   }      之前      

<强>反转
  

        func扭转(s [] int64) [] int64 {   对左、右:=0,len (s) 1;左& lt;对的;左、右=+ 1,右1 {   (左),年代[右]=[右],年代(左)   }   返回年代   }   之前      

<>强分块
  

  

主要用于当单个切片过大,需要分多次使用的时候,比如网络调用等。
  

        func SliceChunk (int [] int64,大小)[][]int64 {   var ret [] [] int64   大小& lt;len (s) {//s(:尺寸:尺寸)表示len为大小,帽子也为大小,第二个冒号后的尺寸表示   年代,ret=s(大小:),附加(ret, s[:大小:大小])   }   ret=append (ret, s)   返回受潮湿腐烂   }   之前      

浅谈去片高级实践