Go 语言标准库中没有提供切片元素删除的函数,可以利用切片也可以取其中的一段形成子切片的特性来实现删除效果。

原切片内容不变

使用 copy 完成删除元素,可以保证原切片内容不变

1
2
3
4
5
6
7
num := []int{0, 1, 2, 3, 4, 5, 6}
n := 2
newSlice := make([]int, n)
copy(newSlice, num[:n])
newSlice = append(newSlice, num[n+1:]...)
fmt.Printf("num:%p, newSlice:%p\n", num, newSlice)
fmt.Printf("num:%v, newSlice:%v\n", num, newSlice)

原切片内容改变

原因 slice 是引用类型,传地址。append 单纯将第二个参数地址的值复制连接到第一个参数尾部。

1
2
3
4
5
6
num := []int {0,1,2,3,4,5,6}
//要删除脚标为n的元素
n:= 2
num1 :=num[0:n]
num1= append(num1,num[n+1:]...)
fmt.Println(num1)

1
2
3
4
5
num := []int {0,1,2,3,4,5,6}
//要删除脚标为n的元素
n:= 2
num1 :=append(num[0:n],num[n+1:]...)
fmt.Println(num1)

注意: 不能在自己的切片上 append,因为切片是引用,会导致后面的往相同内存上进行覆盖改变原切片的值。