7.2 切片
...大约 2 分钟
7.2 切片
7.2.1 概念
切片(slice) 是对数组的一个连续片段的引用。
长度:切片可索引的长度,可通过
len()
获取容量:切片对应底层数组的长度,可通过
cap()
获取长度和容量满足不等式:
0 <= len(s) <= cap()
多个切片若底层数组相同,则切片之间的数组是共享的
声明:
var identifier []type
未初始化的切片值为
nil
, 长度为0初始化:
// 通过数组初始化 var slice []type = arr[start:end] // 通过数组常量, 例如 var slice = []int{1, 2, 3}
表示切片由数组的
start
到end-1
之间的元素构成。[start:end]
为切片表达式:[:]
: 相当于[0:len(arr)]
[n:]
: 相当于[n:len(arr)]
[:m]
: 相当于[0:m]
底层结构
切片在内存中的实际上是有三个域的结构体:
- 指向相关数组的指针
- 切片长度
- 切片容量
7.2.2 将切片传给函数
若函数需要操作数组,可将其切片作为参数:
func sum(a []int) int {
s := 0
for i := 0; i < len(a); i++ {
s += a[i]
}
return s
}
func main() {
var arr = [5]int{0, 1, 2, 3, 4}
sum(arr[:])
}
7.2.3 使用 make() 创建切片
可以使用make()
创建切片:
var slice []type = make([]type, len, cap)
- 省略
cap
:make([]type, len)
那么cap
将等于len
7.2.4 new() 和 make() 的区别
new(T)
: 为类型T分配一片内存,初始化零值并返回类型为*T
的指针 返回一个指向类型为T,值为零值的地址的指针 适用于数组和结构体make(T)
: 返回类型为T的初始值 适用于内建的引用类型:slice, map 和 channel
换句话说就是,new()
只会分配内存和初始化变量,而对于slice, map 和 channel 来说,其底层对应的数据结构并没有初始化,所以需要使用 make()
来进行初始化。
7.2.5 多维切片
和数组一样可以由一维组成多维。
7.2.6 bytes 包
[]byte
类型比较常见,可以使用 bytes
包专门处理,详见 bytes
Powered by Waline v2.15.2