切片 slice

-其分身并不是数组,他指向底层的数组
-作为变长数组的替代方案,可以关联底层数组的局部或全部
-为引用类型
-可以直接创建或从底层数组获取生成
-使用 len() 获取元素个数, cap() 获取容量
-一般使用 make() 创建
-如果多个 slice 指向相同底层数组,其中一个的值改变会影响全部

-make([]T, len, cap)
-其中 cap 可以省略,则和 len 的值相同
-len 表示存储的元素个数, cap表示容量

  1. //创建 array a
  2. a := [10]int{1,2,3,4,5,6,7,8,9}
  3. fmt.Println(a)
  4. //取一个值
  5. sl := a[5]
  6. //截取索引5 到 索引9,不包含 10
  7. sl := a[5:10]
  8. //从 索引为3处 截取到尾部
  9. sl := a[3:]
  10. //从头取到索索引为 5
  11. sl := a[:5]
  12. //完全拷贝
  13. sl := a[:]
  14. //make创建 与len和cap相同时的简写
  15. sl := make([]int,3,3)
  16. sl := make([]int,3,)
  17. sl := make([]int,3)
  18. fmt.Println(sl)

slice 与底层数组的对应关系

Slice 与底层数组的对应关系

  1. Array_ori := []byte{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k'}
  2. Slice_a := Array_ori[2:5]
  3. fmt.Println(string(Slice_a))
  4. Slice_b := Array_ori[3:5]
  5. fmt.Println(string(Slice_b))

reslice

-reslice时索引以被 slice 的切片为准
-索引不可以超过被 slice 的切片的容量 cap()
-索引越界不会导致底层数组的重新分配而是引发错误

append

-可以在 slice 尾部追加元素
-可以将一个 slice 追加在另一个 slice 尾部
-如果最终长度未超过追加到 slice 的容量则返回原始 slice
-如果超过追加到的 slice 的容量则重新分配数组并拷贝原始数据

  1. a := make([]int, 3, 6)
  2. fmt.Printf("%p\n", a)
  3. //追加元素
  4. a = append(a, 1, 2, 3)
  5. fmt.Printf("%v %p\n", a, a)
  6. //超出容量,重新分配内存
  7. a = append(a, 1, 2, 3)
  8. fmt.Printf("%v %p\n", a, a)

copy

  1. a := []int{1,2,3,4,5,6}
  2. b := []int{7,8,9}
  3. copy(a, b)
  4. //结果为 [7 8 9 4 5 6]
  5. fmt.Println(a)
  6. copy(a[1:3], b[0:2])
  7. //结果为 [1 7 8 4 5 6]
  8. fmt.Println(a)