slice数据结构
array指针指向底层数组,len表示切片长度,cap表示底层数组容量
type slice struct {
array unsafe.Pointer //切片底层数组的起始位置
len int //切片长度
cap int //切片容量
}
slice初始化的方法
- 变量声明(与所有类型变量一样,变量声明后变量值为0,对于切片来讲,0值为nil)
- 字面量(声明长度为0的切片时推荐使用变量声明的方式获得一个nil切片,因为nil切片不需要分配内存)
- 内置函数make() (切片元素均初始化为相应类型的零值)
- 适用于任意类型的内置函数new()(此时创建的切片值为nil)
var s []int//变量声明 nil切片,不需要分配内存
s1 := []int{}//长度为0的切片,空切片,指长度为空,其值并不是nil
s2 := []int{1,2,3}//长度为3的切片
fmt.Println(s) //[]
fmt.Println(s1) //[]
fmt.Println(s2) //[1 2 3]
fmt.Println(s==nil) //true
fmt.Println(s1==nil) //false
s3 := make([]int, 12) //指定长度
s4 := make([]int, 10, 100) //推荐指定长度和预估空间,可以有效减小切片扩容时内存分配及拷贝次数
fmt.Println(s3) //[0 0 0 0 0 0 0 0 0 0 0 0]
fmt.Println(s4) //[0 0 0 0 0 0 0 0 0 0]
slice := *new([]int)
fmt.Println(slice) //[]
fmt.Println(slice==nil) //true
slice切取
- 切片可以基于数组和切片创建,切片与原数组或切片共享底层空间,修改切片会影响原数组或切片
- 切片表达式[low : high]表示的是左闭右开的区间[low, high),切取的长度为high-low
array := [5]int{1,2,3,4,5}
s5 := array[0:2] //从数组中切取
s6 := s5[0:1] //从切片中切取
fmt.Println(s5) //[1 2]
fmt.Println(s6) //[1]
append()
当切片空间不足时&#