切片的内部实现和基础功能
文章目录
切片是一种数据结构,这种数据结构便于使用和管理数据集合
切片是动态围绕数组的概念构建的,可以按需自动增长和缩小
切片的自动增长是通过内置函数append 实现的,这个函数可以快速高效的增长切片
还可以对切片再次切片减小一个切片的大小,因为切片在内存中也是连续的存储块,所以切片还可以获取索引、迭代和垃圾回收优化的好处
1.内部实现
切片是一个对底层数组抽象的一个很小的对象
包含3个字段的数据结构:指针、长度、容量
2.创建和初始化
a. make和切片字面量
使用make时需要传入一个参数指定切片的长度
如果只指定长度,则切片的长度和容量相等,也可以分别指定长度和容量(容量>长度)
初始化之后并不能访问所有的元素,只能访问长度内的元素,超出其长度但在容量之内的元素无法访问,这些元素后期可以整合到切片中
// 创建一个容量和长度都是5的字符串切片
slice := make([]string, 5)
// 创建一个长度为3 容量为5 的个元素的整形切片
slice_1 := make([]int, 3, 5)
切面字面量
// 创建长度和容量都是5的字符串切片
slice_2 := []string{
"apple", "banana", "orange"}
// 创建指定长度和容量(50)的切片
slice_3 := []int{
49:0}
// 输出结果:
// == slice_2 : [apple banana orange]
[]运算符内指定数值的时候,创建的就是数组;
不指定的时候,创建的就是切片
b. nil和控空切片
nil切片
只要在声明时不做任何初始化就是nil切片
通常用于描述一个不存在的切片
var slice_4 []int
空切片
空切片底层数组包含0个元素,没有分配任何存储空间
通常用于表示空集合
// 使用make声明空切片
slice_5 :=make([]int, 0)
// 使用字面量创建空切片
slice_6 := []int{
}
// 输出结果:
// == slice_5 : []
// == slice_6 : []
nil 和 空切片其内部调用append、len 和 cap 效果是一样的
3. 切片的使用
a. 赋值和切片
通过索引可以使用[]运算符赋值及查询切片
// 创建切片
slice_7 := []int{
1,2,3,4,5,6}
slice_7[3] = 40
// 输出结果:
// == slice_7 : [1 2 3 40 5 6]
使用切片创建切片
// 创建一个切片
slice_8 := []int{
1,<