切片删除元素的特点
特点:
-
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)
}
删除切片元素的本质是,以被删除元素为分界点,将前后两个部分的内存重新连接起来。