定义以及初始化
切片是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封装,支持自动扩容。
切片是一个引用类型,它的内部结构包含地址、长度和容量。
切片: 指针、长度、容量
声明语法:
var name []T
例如:
1 | var s1 []int |
切片的长度和容量
可以通过使用内置的len()函数求长度,使用内置的cap()函数求切片的容量
切片表达式
切片的底层就是一个数组,所以可以基于数组通过切片表达式得到切片。切片表达式中的 low 和 high 表示一个索引范围(左包含,右不包含)
1 | // 数组 |
当然也可以忽略表达式中的索引。省略了low 则默认是 0,省略了high 则默认为切片操作数的长度
1 | array := [5]int{1, 2, 3, 4, 5} |
对切片在进行切片,high 的上限边界是切片的容量 cap(slice),而不是长度
1 | array := [5]int{1, 2, 3, 4, 5} |
使用 make() 函数构造切片
格式:
make([]T, size, cap)
其中
- T: 切片元素类型
- size: 切片中元素的数量
- cap: 切片的容量
1 | // 声明并初始化一个切片 make初始化 分配内存 |
切片是引用类型
切片不存值, 下方的示例代码s1和s2底层指向同个数组, 故修改s2也影响了s1
1 | s1 := []int{1, 2, 3} // [1 2 3] |
切片的扩容策略
- 如果申请的容量大于原来的 2 倍,那么就直接扩容至新申请的容量
- 如果小于 1024,那么直接两倍
- 如果大于 1024,就按照 1.25 倍去扩容
- 具体存储的值的类型不同,扩容策略也有一定的不同
append 为切片添加元素
1 | var s1 []int |
append 还会自动扩容
copy 复制切片
1 | s1 := []int{1, 2, 3} |
切片的遍历
和数组一致,支持 for 和 for range
1 | s := []int{1, 3, 8, 11} |
学习资料
我的环境
Macgo1.19GoLand