什么是Slice(切片)?

切片是一个拥有相同类型元素的可变长度的序列.是基于数组类型做的一层封装

如何创建Slice(切片)

有两种创建方式:

  1. 可以通过已有的数组创建切片
语法:
arry := []
slice1:= arry[startIndex:endIndex]

number := []int{1, 3, 7, 2, 5}
slice1 := number[1:3]
fmt.Println(slice1) --- [3 7]

如果startIndex为空则从第一个元素开始

number := []int{1, 3, 7, 2, 5}
slice1 := number[:3]
fmt.Println(slice1) --- [1 3 7]

如果endIndex为空则直到最后一个元素3

number := []int{1, 3, 7, 2, 5}
slice1 := number[3:]
fmt.Println(slice1) --- [2 5]
  1. 直接创建 通过make函数定义一个切片
语法:
slice1 := make([]T, length, capacity)

T 为类型
length 为大小/容量

// 创建容量为5,数量为2的int切片数组
slice1 := make([]int, 2, 5)
// 初始化会放入两位为0的值
fmt.Println(slice1)  --- [0 0]

len() 和 cap() 函数

Slice是具有索引的,len()是获取切片的长度,cap()是获取切片的容量

// 创建容量为5,数量为2的int切片数组
slice1 := make([]int, 2, 5)
// 分别打印长度、容量、内容
fmt.Printf("len=%d cap=%d slice=%v\n", len(slice1), cap(slice1), slice1)

len=2 cap=5 slice=[0 0]

append() 和 copy() 函数

问题:无法向容量为0的切片中添加元素

// 创建一个容量为0的切片
slice1 := make([]int, 0)
// 向切片中放数据,下标越界
//slice1[0] = 10
// len=0 cap=0 slice=[]
printSlice(slice1)

// 定义一个打印切片信息的函数 打印内容包括长度、容量、元素内容
func printSlice(s []int) {
    fmt.Printf("len=%d cap=%d slice=%v\n", len(s), cap(s), s)
}

利用append()函数追加元素

// 创建一个容量为0的切片
slice1 := make([]int, 0)
// 向切片中放数据,下标越界
//slice1[0] = 10
printSlice(slice1)
// 利用 append() 函数追加元素
slice1 = append(slice1, 1, 2, 3)
// len=3 cap=3 slice=[1 2 3]
printSlice(slice1)

复制切片元素至另一个切片

// 创建一个大小容量一样的切片, 将数据复制到新的切片中
slice2 := make([]int, len(slice1), cap(slice1))
copy(slice2, slice1)
printSlice(slice2)

切片基于数组,在内存中修改了数组中的数据,切片数据也会随之改变

number := []int{1, 3, 7, 2, 5}
fmt.Println(number)
slice1 := number[:3]
printSlice(slice1)

number[0] = 9
fmt.Println(number)
printSlice(slice1)

[1 3 7 2 5]
len=3 cap=5 slice=[1 3 7]
[9 3 7 2 5]
len=3 cap=5 slice=[9 3 7]