go语言如何从切片中删除元素


这篇文章主要介绍“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如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“commons-io如何使用”吧!引入依赖案例1感谢各位的阅读,以上就是“commons-io如何使用”的内容了,经…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 03/01 22:07
下一篇 03/01 22:07

相关推荐