切片可以扩展
目录:程序员成长之旅/Go语言学习/笔记
切片可以扩展
在切片中 有三个变量, 分别为
ptr 指向被view的数组头
len 标明切片的长度
cap 标明被指向数组的真实长度
切片的扩展
切片可以在cap的容量范围内向后扩展
arr := [...]{0, 1, 2, 3, 4, 5, 6, 7}
s1 = arr[2:6] //[2, 3, 4, 5] len(s1)=4 cap(s1)=6
s2 = arr[3:5] //[5, 6] len(s2)=2 cap(s2)=3
//在s2中, 就发生了扩展, 扩展不受len的影响, 而是受到源数组cap的长度影响
2. 切片无法向前扩展, 因为ptr已经随着切片而发生改变, 所有无法向前扩展
### 切片的添加元素行为
```golang
arr := [...]{0, 1, 2, 3, 4, 5, 6, 7}
s1 = arr[2:6]
s2 = arr[3:5]//[5, 6]
//以上为上个知识点的代码
s3 = append(s2, 10)
s4 = append(s3, 11)
s5 = append(s4, 12)
fmt.printf("s3 = %v, s4 = %v, s5 = %v\n", s3, s4, s5) //s3 = [5, 6, 10], s4 = [5, 6, 10, 11], s5 = [5, 6, 10, 11, 12]
fmt.println("arr = ", arr) //arr = [0, 1, 2, 3, 4, 5, 6, 10] 注意最后一位, 在s3的append中, 直接将最后一位进行了替换, 原位置数据丢失. 并且没有出现s4以及s5进行append的数据, 这些数据在上边以及成功打印, 但是现在数据不再原数组中, 那么这些数据到了哪里?
向数组添加元素时, 如果超越cap, 那么系统会重新分配更大的数组
由于append是值传递操作, 返回的切片可能会改变len, cap, 甚至ptr都会改变, 所以必须接收append操作所返回的值