在前面的文章中,我们简单的介绍了数组,但没说数组的缺点是什么?数组有个缺点就是初始化之后数组的长度就固定了,不能改变。但有时,我们不能在一开始就很精确的知道,我们要存储多少个元素,这样的话,对初始化数组的时候,就不好去给定个初始长度,给少了不行,给太多了又很浪费。
在Go中,我们可以使用它给我们提供的slice(切片),可以不用关心初始化数组长度这个问题。
什么是切片?
切片中有3个参数
- len:表示切片当前可存储元素的个数
- cap:表示切片最大可存储元素的个数
- ptr:存储的是指向数组的指针(可以看做是存储了数组)
注:len <= cap
切片不是数组,但切片中有个指向数组的指针,是专门用来引用数组的,所以切片是什么?我觉得切片是一个引用了数组的结构体。
切片的创建
直接创建切片
// len代表了切片的长度,cap代表了切片的容量
make([]类型, len, cap)
// len = cap,只要填一个参数,就同时指代了len和cap
make([]类型, (len = cap))
代码示例
slice := make([]int, 6, 15)
fmt.Println("切片的长度:", len(slice), "切片的容量:", cap(slice))
输出
切片的长度: 6 切片的容量: 15
slice := make([]int, 6)
fmt.Println("切片的长度:", len(slice), "切片的容量:", cap(slice))
输出
切片的长度: 6 切片的容量: 6
通过数组创建切片
注:[左:右),表示数组在转成切片的时候,包左不包右,看下面代码理解这个包左不包右的意思
值1:表示从哪个位置开始切
值2:表示截止切的位置,可以从这个知道len的长度:len = 值2 - 值1
值3:表示切片的容量为:cap = 值3 - 值1
变量名 := 数组[值1:值2:值3]
代码示例
a := [10]int{
0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
slice := a[2:6:8]
fmt.Println("切片的长度为:", len(slice), "\n切片的容量为:", cap(slice), "\n切片的值为:", slice)
输出
切片的长度为: 4
切片的容量为: 6
切片的值为: [2 3 4 5]
len = 冒号右边的值 - 冒号左边的值
cap = 数组的长度 - 冒号左边的值
左边不填就是0,右边不填就是数组长度
变量名 := 数组[值1:值2]
a := [10]int{
0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
slice := a[2:7]
fmt.Println("切片的长度为:", len(slice), "\n切片的容