前言

今天还是用golang搬砖,突然遇到一个删除切片中指定元素的需求,我在想有向切片中添加元素的内置函数,删除的有没有,没想到一搜没有…而且大概看了一下大家都是用append实现指定元素删除,效率貌似还挺高,今天就记录一下怎么用append删除指定元素

append详解

append首先是将数组上层的切片取出,然以我们向其后方添加一个元素,然后返回新的切片,但是切片有一个非常好的功能就是切片截断,比如我有一个切片

a := []int{1,2,3,4,5,6,7,8,9}

我需要一个新的切片,切片只包含前三个元素,那么新的切片如下

a := a[:3]
//a[:3]代表我们去第0,1,2个元素,不取第3个元素,一定要明白是从0开始算的

如果我们要去除前2个元素那么新的切片如下

a := a[2:]
//取第二个元素到结尾元素的值,照样是从0开始算,取0,1,2不能算进去
删除元素
a[:2]a[3:]
a := append(a[:2],a[3:]...)

为什么第二个切片后面有三个点,因为我们要将切片打散,什么意思呢?我们直接在一个切片后面增加另一个切片是不行的,我们需要把切片进行打散成一个一个的元素,然后传递到前一个切片中,为什么不能直接将2个切片合并?我的猜想是append考虑了切片底层数组的大小,如果我们往切片后面加上一个参数此时正好切片的大小大于底层数组的大小,那么底层数组将会被换一个原来容量2倍的数组,注意这个将底层数组换成2倍的操作是一个固定操作,不是换成3倍,4倍,如果我们往后直接累加一个切片,加入后加入的切片大小是底层数组的3倍,岂不是我们将原先的底层数组更换成原先的2倍还是装不下吗,所以我们需要一个一个的append