原站地址:Go语言核心36讲_Golang_Go语言-极客时间
一、数组和切片
1. 两者最大的不同:数组的长度是固定的,而切片的长度是可变的。
2. 可以把切片看成是对数组的一层封装,因为每个切片的底层数据结构中,一定会包含一个数组。 切片也可以被看作是对底层数组的某个连续片段的引用(窗口)。
3. go语言不存在传值或传引用两种区分。 只要传递的是引用类型的,就是“传引用”。如果传递的是值类型的,就是“传值”。 切片属于引用类型,数组属于值类型。
4. 内建函数 len()计算长度,cap()计算容量。
例子: s1是切片,底层数组是8个元素。 s2 := s1[3:6]
len(s2) = 6-3, 即 结束索引 减去 起始索引
cap(s2) = 8-3,即 底层数组长度 减去 起始索引 , 从起始索引位置向右扩展到最末端
5. 切片容量的增长逻辑:
(1) 一般情况下,新切片的容量将会是原切片容量的 2 倍。
(2) 如果新长度比原容量的 2 倍还要大,那么新容量就会以新长度为基准。
(3) 如果原长度大于等于1024,会以原容量的1.25倍作为基准,一直扩展到满足扩容需求。
6. 切片的底层数组在扩容时不会被替换。 扩容时是使用了新的切片和新的底层数组。 旧切片不变。