这是我参与「第五届青训营 」伴学笔记创作活动的第 8 天
slice切片
基本定义
数组长度不可变,切片补足了这个缺点,是一个动态数组,切片是数组的一个引用
var slicename [] type
- 切片是数组的一个引用,那么切片是一个引用类型,这和数组是不一样的,函数中改变的会改变其值
- 切片的长度是可以变化的
- 切片的使用类似于数组,遍历和访问都是和数组一样的
- 切片的定义基本语法:
var intArr [5]int = [...]int{11,22,33,44,55} //数组 slice := intArr[1:3]slice是切片名称intArr[1:3]表示slice引用数组第二个元素到下标- 引用
intArr数组的起始下标为1,终止下标为3,但是不包含3 - 切片的容量
cap是可变的,这样可以节约空间 - 此时改变数组的值,
slice的值也会发生变化(引用)
结构
可以理解为slic是一个引用类型(本身也是有个地址),slic从底层来说其实就是一个数据结构,是struct结构体
type slice struct{
ptr *[2]int
len int
cap int
}
- 第一个位置记录的是数组的地址,是引用类型
- 第二个记录了slic本身的长度
- 第三个记录的是slic容量的大小
使用
- 定义一个切片和数组,让切片去引用数组
var intArr [5]int = [...]int{11,22,33,44,55} //数组 slice := intArr[1:3] - 通过func make来创建一个切片:
var 切片名 []type = make([],len,[cap])- type 是数据类型
- len :切片大小
- cap:切片容量
法一和法二的区别
1. 方式一是直接引用数组,数组是值类型,而引用的是引用类型,数组是事先存在的,程序员是可见的
1. make创建切片,这个切片是在底层中,程序员是不可见的
初始化
- s :=[] int {1,2,3 }:直接初始化切片,[] 表示是切片类型,{1,2,3} 初始化值依次是 1,2,3,其 cap=len=3。
- s := arr[startIndex:endIndex]:将 arr 中从下标 startIndex 到 endIndex-1 下的元素创建为一个新的切片。
- s := arr[:endIndex]:默认 startIndex 时将表示从 arr 的第一个元素开始。
- s1 := s[startIndex:endIndex]:通过切片 s 初始化切片 s1。
- s :=make([]int,len,cap):通过内置函数 make() 初始化切片s,[]int 标识为其元素类型为 int 的切片。
遍历
- 常规遍历:for遍历
- for range遍历
注意
- 通过make方式创建的切片可以指定切片的大小和容量
- 如果没有给切片的各个元素赋值,就会使用默认值
- 通过make方式创建的切片对应的数组是由make底层维护,对外部可见,只能使用slice去访问
- 对切片初始化后任然不能越界,但是可以动态增长
常用函数
- cap:容量
- len:长度
- append:追加容量
- copy:复制切片1->切片2
- string:不可变的,如果需要改变,此时将其字符串转化为切片或者run切片,再转化为字符串