通过数组产生切片和删除切片内容
先让我们直接上代码吧
import "fmt"
func main() {
num := [5] int {1,2,3,4,5}
s := num[0:2]//将下标为2的元素删除,保留前方元素在切片中
fmt.Println(s)
fmt.Printf("%T \n",s)//数据类型为[]int
fmt.Printf("%T \n",num)//[5]int
//因为切片的实质为指针,所以数组的元素会随切片的改变而改变
fmt.Printf("%p %p\n",s,&num[0])//输出s指向的地址与num首元素地址(二者相等)
s[0] = 6
fmt.Println(num,s)
//切片的变化造成了它所指向的数组的变化
s = append(s,7)//向切片中添加元素
fmt.Println(num,s)//不超出数组长度时将直接取代数组对应位置的元素值
s= append(s,8,9,10)//添加多个元素当超过数组长度时开辟新的地址空间存储切片s,此时s不再指向数组,所以s的改变不影响数组num
fmt.Println(num,s)
fmt.Printf("%p %p\n",s,&num[0])//两者的地址不同
//实现删除操作
n:=2//要删除的下标索引
newSlice := s[0:n]//保留下表为n前的元素在切片newSlice中
newSlice = append(newSlice,s[n+1:]...)//将下表为n的元素后的元素再添加到newSlice切片当中去
fmt.Println(s)
fmt.Println(newSlice)
}
输出结果
[1 2]
[]int
[5]int
0xc00000c2d0 0xc00000c2d0
[6 2 3 4 5] [6 2]
[6 2 7 4 5] [6 2 7]
[6 2 7 4 5] [6 2 7 8 9 10]
0xc000016190 0xc00000c2d0
[6 2 8 9 10 10]
[6 2 8 9 10]
- 由此可以看出切片中内容存在一块连续空间(与数组相同)
- Go语言标准库中没有提供删除的函数
- 切片也可以取其中一段形成子切片,我们可以利用这个特性实现删除效果(●’◡’●)