一、Slice及特点
slice是语言中经常使用的数据结构之一,也叫切片,实际上slice是数组的一段视图,也可以理解为是数组的某一部分的引用。
Slice包含三个部分:
- ptr:第一个元素的指针
- len:切片长度
- cap:切片容量
特点:
切片的扩展,底层的数组可能会变化。
对切片还可以取切片
切片可以向后扩展,容量自动扩展
arr := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
//取全部
slice1 := arr[:]
fmt.Println(slice1)
//取下标2到4,前闭后开区间
slice2 := arr[2:4]
fmt.Println(slice2)
//取下标2之后的全部区间
slice3 := arr[2:]
fmt.Println(slice3)
//取到第四个数组,0-3
slice4 := arr[:4]
fmt.Println(slice4)
//对切片还可以取切片,slice2中的下标2到4,前闭后开区间
slice5 := slice2[2:4]
fmt.Println(slice5)
result:
[1 2 3 4 5 6 7 8 9 10]
[3 4]
[3 4 5 6 7 8 9 10]
[1 2 3 4]
[5 6]
二、Slice声明定义
定义切片
var s []int //此时没有分配底层数组
s1 := []int{1, 2, 3}
//10表示长度,32表示容量,已经分配了底层数组
s2 := make([]int, 10, 32)
fmt.Println(s, s1, s2)
结果:
[] [1 2 3] [0 0 0 0 0 0 0 0 0 0]
可见,var 和make创建slice的结果是不同的
三、slice操作
追加:append,返回新slice
var s []int
s = append(s, 1)
fmt.Println(s)
//[1]
删除:
//删除3元素
ss3 := []int{1, 2, 3, 4, 5, 6}
ss4 := append(ss3[:2], ss3[3:]...)
fmt.Println(ss4)
//[1 2 4 5 6]
拷贝:
ss1 := []int{1, 2, 3}
ss2 := make([]int, 8, 16)
copy(ss2, ss1)
fmt.Println(ss2)
//[1 2 3 0 0 0 0 0]