定义以及初始化
切片是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封装,支持自动扩容。
切片是一个引用类型,它的内部结构包含地址、长度和容量。
切片: 指针、长度、容量
声明语法:
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} |
学习资料
我的环境
Mac
go1.19
GoLand