这篇文章主要介绍“go语言如何从切片中删除元素”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“go语言如何从切片中删除元素”文章能帮助大家解决问题。 删除方法:1、对切片进行截取来删除指定元素,语法“append(a[:i], a[i+1:]…)”。2、创建一个新切片,将要删除的元素过滤掉后赋值给新切片。3、利用一个下标index,记录下一个有效元素应该在的位置;遍历所有元素,当遇到有效元素,将其移动到 index且index加一;最终index的位置就是所有有效元素的下一个位置,最后做一个截取即可。Go 并没有提供删除切片元素专用的语法或函数,需要使用切片本身的特性来删除元素。删除切片指定元素一般有如下几种方法,本文以 []int 为例给出具体实现。1.截取法(修改原切片)这里利用对 slice 的截取删除指定元素。注意删除时,后面的元素会前移,所以下标 i 应该左移一位。
//DeleteSlice1删除指定元素。 funcDeleteSlice1(a[]int,elemint)[]int{ fori:=0;i
2.拷贝法(不改免费云主机域名原切片)这种方法最容易理解,重新使用一个 slice,将要删除的元素过滤掉。缺点是需要开辟另一个 slice 的空间,优点是容易理解,而且不会修改原 slice。
//DeleteSlice2删除指定元素。 funcDeleteSlice2(a[]int,elemint)[]int{ tmp:=make([]int,0,len(a)) for_,v:=rangea{ ifv!=elem{ tmp=append(tmp,v) } } returntmp }
3.移位法(修改原切片)3.1 方式一利用一个下标 index,记录下一个有效元素应该在的位置。遍历所有元素,当遇到有效元素,将其移动到 index 且 index 加一。最终 index 的位置就是所有有效元素的下一个位置,最后做一个截取就行了。这种方法会修改原来的 slice。该方法可以看成对第一种方法截取法的改进,因为每次指需移动一个元素,性能更加。
//DeleteSlice3删除指定元素。 funcDeleteSlice3(a[]int,elemint)[]int{ j:=0 for_,v:=rangea{ ifv!=elem{ a[j]=v j++ } } returna[:j] }
3.2 方式二创建了一个 slice,但是共用原始 slice 的底层数组。这样也不需要额外分配内存空间,直接在原 slice 上进行修改。
//DeleteSlice4删除指定元素。 funcDeleteSlice4(a[]int,elemint)[]int{ tgt:=a[:0] for_,v:=rangea{ ifv!=elem{ tgt=append(tgt,v) } } returntgt }
4.性能对比假设我们的切片有 0 和 1,我们要删除所有的 0。这里分别对长度为 10、100、1000 的切片进行测试,来上下上面四种实现的性能差异。生成切片函数如下:
funcgetSlice(nint)[]int{ a:=make([]int,0,n) fori:=0;i
基准测试代码如下:
funcBenchmarkDeleteSlice1(b*testing.B){ fori:=0;i
测试结果如下:原切片长度为 10:
gotest-bench=.main/slice goos:windows goarch:amd64 pkg:main/slice cpu:Intel(R)Core(TM)i7-9700CPU@3.00GHz BenchmarkDeleteSlice1-81746648665.07ns/op BenchmarkDeleteSlice2-81489728285.22ns/op BenchmarkDeleteSlice3-82195212950.78ns/op BenchmarkDeleteSlice4-82217639054.68ns/op PASS okmain/slice5.427s
原切片长度为 100:
BenchmarkDeleteSlice1-81652146762.1ns/op BenchmarkDeleteSlice2-82124237578.4ns/op BenchmarkDeleteSlice3-83161318359.9ns/op BenchmarkDeleteSlice4-82714158423.7ns/op
原切片长度为 1000:
BenchmarkDeleteSlice1-85606721915ns/op BenchmarkDeleteSlice2-82586625007ns/op BenchmarkDeleteSlice3-84320492724ns/op BenchmarkDeleteSlice4-83251943615ns/op
关于“go语言如何从切片中删除元素”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注百云主机行业资讯频道,小编每天都会为大家更新不同的知识点。
这篇文章主要讲解了“commons-io如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“commons-io如何使用”吧!引入依赖案例1感谢各位的阅读,以上就是“commons-io如何使用”的内容了,经…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。