切片

切片类型

  • 切片的英文名称 slice

  • 切片:具有可变长度相同类型元素序列

  • 由于长度是可变的,可以解决数组长度在数据个数不正确情况下浪费内存的情况。

  • 切片和数组声明语法最主要的区别就是长度

    1
    2
    var slice []string //切片
    var array[3]string //数组
  • 切片只声明为nil,没有开辟内存空间,不能直接操作切片,需要初始化

    • 注意:切片只能和nil进行判断是否相等
    1
    2
    3
    4
    5
    6
    func main() {
    var slice []string
    fmt.Println(slice)
    fmt.Println(slice==nil)
    fmt.Printf("%p",slice)
    }

定义切片

  • 通过直接指定初始值定初始化一个切片变量

    1
    2
    names:= []string{"abc","佳明哥"}
    fmt.Println(names)
  • 定义完切片后就可以通过切片对象[脚标]取出或修改切片中元素内容,语法和数组相同

切片是引用类型

  • 引用类型在变量之间赋值时传递的是地址,引用类型变量就是这个类型的指针,切片就是引用类型。
  • 值类型在变量之间赋值时传递的是值的副本。
1
2
3
4
5
6
7
8
//切片是引用类型
names:= []string{"abc","nige"}
fmt.Println(names)

names1 := names
names1[0] = "张***"
fmt.Println(names1,names)
fmt.Printf("%p %p",names1,names)

make函数

  • Go语言中可以使用make函数创建 slice 、 map 、 channel 、interface

  • 使用make函数定义无内容,但是不是nil的切片,意味着切片已经申请了内存空间

    • make(类型,初始长度 [,初始容量])
    • 初始容量可以省略,默认和长度相等。
    1
    2
    3
    slice := make([]string,0)  //长度为0的切片,没有第三个参数表示容量和长度
    slice1 := make([]string,0,2) //长度为0 容量为 2
    fmt.Println(slice,slice1)
  • 长度表示切片中元素实际个数,容量表示切片占用空间大小,且切片成倍增加。当增加到1024后按照一定百分比增加。

    • len(slice) 查看切片长度
    • cap(slice) 查看切片的容量
    1
    2
    3
    4
    slice :=make([]string,0)   //长度为0的切片,没有地第三个参数表示容量和长度相等。
    slice1 := make([]string,0,3) //长度为0 ,容量为2
    fmt.Println(len(slice),cap(slice))
    fmt.Println(len(slice1),cap(slice1))

copy函数

  • 通过copy函数可以把一个切片内容复制到另一个切片中

  • Go语言标准库源码定义如下

    • 第一个参数是目标切片,接收第二个参数内容
    • 第二个参数是源切片,把内容拷贝到第一个参数中
    1
    func copy(dst,src[]type) int
  • 拷贝时严格按照脚标来拷贝

例子:

  • 把短切片拷贝到长切片

    1
    2
    3
    4
    5
    s1 := []int {1,2}
    s2 := []int {3,4,5,6}
    copy(s2,s1)
    fmt.Println(s1) //输出:{1 2}
    fmt.Println(s2) //输出:{1 2 5 6}
  • 把长切片拷贝到短切片中

    1
    2
    3
    4
    5
    s1 := []int {1,2}
    s2 := []int {3,4,5,6}
    copy(s1,s2)
    fmt.Println(s1) //输出:{3 4}
    fmt.Println(s2) //输出:{3 4 5 6}
  • 把切片片段拷贝到切片中

    1
    2
    3
    4
    5
    s1 := []int {1,2}
    s2 := []int {3,4,5,6}
    copy(s1,s2[1:])
    fmt.Println(s1) //输出:{3 4}
    fmt.Println(s2) //输出:{3 4 5 6}