什么是 slice

对数据的抽象,不带长度的数组,动态数组,可以追加元素

一种方便,灵活强大的容器,切片本身没有任何数据,它们只是对现有数组的引用。

在概念上讲,slice像一个结构体,包括三个元素

  1. 指针
  2. 长度
  3. 最大长度(容量)

定义

  1. var identifier []type

如何操作

创建

slice的秘密 - 图1

  1. var slice1 []type = make([]type, len)
  2. slice1 := make([]type, len)
  3. make([]T, length, cap)

添加元素

使用 append 向 slice 中添加元素

  1. slice = append(slice, elem1, elem2)
  2. slice = append(slice, anotherSlice...)

遍历

  1. for i:=0; i<len(slice); i++ {
  2. fmt.Println(slice[i])
  3. }
  4. for i, v := range slice {
  5. fmt.Println(i, "->", v)
  6. }

slice内存分析与扩容

向slice中添加元素,

  • 本次添加没有超过 slice 容量,直接添加
  • 本次添加超过 slice容量

    • 底层建立新数组(原底层数据容量2倍)
    • 复制旧数组元素 ——> 新数组
    • slice 指针指向新数组 ```go func main() { s1 := []int{1, 2, 3} fmt.Println(s1) // [1 2 3] fmt.Printf(“len: %d, cap: %d\n”, len(s1), cap(s1)) // len: 3, cap: 3 fmt.Printf(“%p\n”, s1) // 0xc00000a400

      s1 = append(s1, 4, 5) fmt.Println(s1) // [1 2 3 4 5] fmt.Printf(“len: %d, cap: %d\n”, len(s1), cap(s1)) // len: 5, cap: 6 fmt.Printf(“%p\n”, s1) //0xc00000c2d0

}

  1. <a name="I7Obi"></a>
  2. ## 根据数据创建slice
  3. <a name="bUAHA"></a>
  4. ## 深copy和浅copy
  5. 什么是深copy和浅copy
  6. - 深copy: 拷贝的数据本身
  7. - 值类型的数据, 默认都是深copy: arry, int, float, string, bool, struct
  8. - 浅copy: 拷贝的数据地址(指针)
  9. - 引用类型的数据,默认都是浅copy: slice, map
  10. <a name="u6U7x"></a>
  11. ### slice 的深copy
  12. 1. 循环copy到新slice
  13. 1. 使用内置 copy 函数
  14. <a name="guKoN"></a>
  15. ### copy函数
  16. 函数签名
  17. ```go
  18. func copy(dst, src []Type) int

The copy built-in function copies elements from a source slice into a destination slice. (As a special case, it also will copy bytes from a string to a slice of bytes.) The source and destination may overlap. Copy returns the number of elements copied, which will be the minimum of len(src) and len(dst).

内建函数,copy元素从一个源slice -> 目标 slice