Slice

语法

  • slice底层引用了数组对象,一个slice由三个部分组成:指针、长度和容量。

  • 指针指向第一个slice元素对应的底层数组元素地址,长度对应slice元素的地址,容量对应slice开始位置到底层数组结尾位置。

  • 内置的lencap返回slice的长度和容量。

  • 如果切片操作超过了cap的上限,将导致panic异常。

创建

一个slice类型一般写为[]T,其中T代表slice中元素的类型。

  • 可以使用var创建,得到的是slice的零值nil

    var s []int
  • 可以通过已有slice或者数组创建:

    // 引用第i个元素到第j-1个元素
    s1 := s1[i:j]

    如果i省略,将使用0代替;如果j省略,将使用j-1代替。

  • 可以使用字面值语法创建:

    // 顺序指定初始值
    s1 := []int{1, 2, 3}
    // 索引指定初始值
    s2 := []int{1: 1, 9: 9}
    // 二者混合使用
    s3 := []int{1: 1, 2, 3, 4, 9: 9}
  • 可以使用make创建:

    // 仅指定长度
    s1 := make([]int, 10)
    // 指定长度容量
    s2 := make([]int, 5, 10)

零值

  • 一个零值的slice等于nil

  • 零值的slice没有底层数组,长度和容量都是0。

  • 可能存在非零值的slice,长度和容量都是0。

  • slice只能与nil比较。

  • 可以通过[]int(nil)创建一个对应类型slicenil值。

  • nil值的slice的行为和其他任意0长度的slice一样。

append函数

  • 内置的append函数向slice追加元素。

    var x []int
    x = append(x, 1)
    x = append(x, 2, 3)
    x = append(x, x...)
  • append函数可能会导致底层数组内存空间的重新分配

copy函数

  • 将一个slice复制到另一个相同类型的slice,并且返回两者中的较小者。

    copy(dst, src)

Last updated

Was this helpful?