去语言切片是对数组的抽象。
去数组的长度不可改变,在特定场景中这样的集合就不太适用,去中提供了一种灵活,功能强悍的内置类型切片(“动态数组”),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。
<强>定义切片强>
你可以声明一个未指定大小的数组来定义切片:
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) 返回受潮湿腐烂 } >之前浅谈去片高级实践