📦 归档笔记 — 原创建于 WizNote,仅作归档展示;观点以当年为准,非最新。

切片可以扩展

创建时间2021-10-06最后修改2021-10-06原位置/程序员成长之旅/Go语言学习/笔记/字数410
目录:程序员成长之旅/Go语言学习/笔记

切片可以扩展

在切片中 有三个变量, 分别为

  • ptr  指向被view的数组头

  • len 标明切片的长度

  • cap 标明被指向数组的真实长度

切片的扩展

  1. 切片可以在cap的容量范围内向后扩展

  2. 
    

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操作所返回的值