8.25Go之容器之切片删除元素

8.25Go之容器之切片删除元素

切片删除元素的特点

特点:

  • Go语言并没有对删除切片元素提供专用的语法或者接口,需要使用切片本身的特性来删除元素

删除切片的种类

  • 从开头位置删除

  • 从中间位置删除

  • 从结尾位置删除


开头位置删除

直接移动数据指针

本质:

  • 需要删除开头第几个就直接创建后面的切片然后复制到原切片上

示例:

package main

import "fmt"

func main() {
/*声明一个切片*/
var array = []int{1,2,3,4,5,6}
/*打印出这时候的切片长度*/
fmt.Println(cap(array))

array = array[2:] //保留数组2号位后的元素然后复制给原数组,可以利用cap函数看看容量的变化

fmt.Println(cap(array), array)
}

原切片的长度改变了

不移动数据指针,但是将后面的数据向开头移动

用 append 原地完成(所谓原地完成是指在原有的切片数据对应的内存区间内完成,不会导致内存空间结构的变化)

package main

import "fmt"

func main() {
/*声明一个切片*/
var array = []int{1, 2, 3, 4, 5, 6}
arrays := [...]int{1,2,3,4,5,6}

fmt.Println(array[:0]) //相当于初始化了原切片
fmt.Println(cap(array[:0]))

/*使用append函数给切片赋值*/
array = append(array[:0], array[1:]...)
/*
将目标切片的1号索引后的值添加到初始化的自身切片中
保证了内存区域的一致性
*/
fmt.Println(arrays[0]) //通过数组索引找到对应的值打印出来
fmt.Println("######")
fmt.Println(array[0]) //打印出的是2,不是数组索引对应的值
/*
要注意区分数组的声明方式和切片的声明方式
*/
fmt.Println(copy(array, array[1:]))
fmt.Println(array)
}

array[:0]相当于初始化了原切片--->其本来的切片容量不变

copy()函数删除开头元素

package main

import "fmt"

func main() {
/*声明一个切片*/
var array = []int{1, 2, 3, 4, 5, 6}

/*使用copy函数进行复制*/
array = array[:copy(array, array[1:])]
array = array[:copy(array, array[3:])]

fmt.Println(array)
/*
1、利用切片的性质,从开头获取元素
2、使用copy函数返回一个int类型的数
1、将要删除的开头元素不包含再目标切片当中
*/
}

中间位置删除

  • 使用append()函数删除

  • 使用copy()函数删除


删除中间的元素,需要对剩余的元素进行一次整体挪动,可以用 append 或 copy 原地完成

从中间删除位置的内存方式:

append()函数

package main

import "fmt"

func main() {
/*声明一个切片*/
var array = []int{1, 2, 3, 4, 5, 6, 7}

fmt.Println(array[:2])

/*使用append方法删除中间部分的元素*/
//删除掉元素3
array = append(array[:2], array[3:]...)

fmt.Println(array)
}

代码说明:

要删除元素3:

  • 已知元素3的索引位置(切片的索引和数组的传统索引不一样)

  • 将元素3之前的元素作为源切片

  • 将元素3之后的元素作为目的切片

  • 使用append()函数拼接起来

copy()函数

package main

import "fmt"

func main() {
/*声明一个切片*/
var array = []int{1, 2, 3, 4, 5, 6, 7, 8, 9}

/*使用copy的方法*/
//删除3号元素--->先把3号之后的元素复制到3号的位置上
copy(array[:2], array[3:])
/*
这个时候3号元素之前的元素已经被删除了
要再用切片的方法去保留前两位元素
*/

fmt.Println(array)

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

array = array[:2+copy(array[:2], array[3:])]

fmt.Println(array)
}

运用不好,对copy()函数理解不深

从尾部删除

直接使用len()方法获取长度然后截取切片即可

package main

import "fmt"

func main() {
/*声明切片*/
var array = []int{1, 2, 3, 4, 5, 6}

/*对切片进行尾部删除--->使用len方法然后重新截取切片*/
array = array[:len(array)-1]
/*
要删除第N个元素就-N
*/

fmt.Println(array)
}

删除切片元素的本质是,以被删除元素为分界点,将前后两个部分的内存重新连接起来。

 

It's a lonely road!!!
原文地址:https://www.cnblogs.com/JunkingBoy/p/15187943.html