Image Description

切片就是动态数组,并且长度不固定。我们可以往切片中随意增加元素,切片在容量不足时会自动扩容。是 Go 语言中常用的数据结构

切片初始化

letters := []string{"b", "e", "a", "u", "t", "y"}

切片的声明方式和数组很像,不一样的地方就是切片没有指定元素个数。

切片可以通过内置函数 make创建,函数签名为:

func make([]T, len, cap)[ ]T

实际使用

var s[]byte
s = make([]byte, 5, 5)

make函数中 T代表被创建的切片元素类型,它接收的参数依次是:一个类型、一个长度和一个可选的容量参数。在使用make函数时,Go 语言内部会分配一个数组,然后返回数组对应的切片。

len() 和 cap()函数

切片的声明还可以这样写:

s := make([]byte, 5)

通过内置函数 len 和 cap 获取切片的长度和容量信息

len(s)
cap(s)

截取切片

通过设置下限和上限截取切片,举例:

len(s)array := [ ]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

array[:6:8] 的结果是 [0 1 2 3 4 5] 

array[5:] 的结果是 [5 6 7 8 9]

array[:3] 的结果是 [0 1 2] 

array[:] 的结果是 [0 1 2 3 4 5 6 7 8 9] 

代码示例

package main

import "fmt"

func main() {
    a := []int{1, 2, 3, 4, 5}
    s := a[0:3:5]  
    fmt.Println("s = ", s)
    fmt.Println("len(s) = ", len(s)) //长度
    fmt.Println("cap(s) = ", cap(s)) //容量
    
    s = a[1:4:5]
    fmt.Println("s = ", s)           //从下标1开始,取4-1=3个
    fmt.Println("len(s) = ", len(s)) //长度  4-1
    fmt.Println("cap(s) = ", cap(s)) //容量  5-1
}

append() 和 copy() 函数

append() 增加切片容量的原理就是,创建一个新的容量更大的切片,并把原来切片的内容都拷贝过来。

用 append函数向切片 slice尾部添加数据,并返回新的 slice对象:

package main

import "fmt"

func main() {
   var numbers []int
   printSlice(numbers)
   //len=0 cap=0 slice=[]

   numbers = append(numbers, 0)
   printSlice(numbers)
   //len=1 cap=1 slice=[0]

   numbers = append(numbers, 1)
   printSlice(numbers
   //len=2 cap=2 slice=[0 1]

   numbers = append(numbers, 2,3,4)
   printSlice(numbers)
   //len=5 cap=6 slice=[0 1 2 3 4]

   numbers1 := make([]int, len(numbers), (cap(numbers))*2)

   copy(numbers1,numbers)
   printSlice(numbers1)  
   //len=5 cap=12 slice=[0 1 2 3 4]
}

func printSlice(x []int){
  fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}

copy() 在两个切片之间复制数据,复制长度以切片长度小的切片为准,两个切片可以指向同一底层数组。

短切片复制给长切片,就是长切片的前几个值被替换成短切片的数据。

package main

import "fmt"

func main() {
    srcSlice := []int{1, 2}
    dstSlice := []int{6, 6, 6, 6, 6}

    copy(dstSlice, srcSlice)
    fmt.Println("dst = ", dstSlice)
    //dst =  [1 2 6 6 6]
}

长切片复制给短切片,就是把短切片的长度给了长切片,长切片的长度变了。

package main

import "fmt"

func main() {
    srcSlice := []int{1, 2}
    dstSlice := []int{6, 6, 6, 6, 6}

    copy(srcSlice,dstSlice)
    fmt.Println("dst = ", srcSlice)
    //dst =  [6 6]
}