定义
-
为什么需要切片?
保存不确定长度的数据。切片就是动态数组,它的长度并不固定,我们可以随意向切片中追加元素,而切片会在容量不足时自动扩容。 -
切片是数组的一个引用,是引用类型
-
切片的定义:var 变量名 []元素类型
-
一个slice由三个部分构成:指针、长度和容量。指针指向第一个slice元素对应的底层数组元素的地址,要注意的是slice的第一个元素并不一定就是数组的第一个元素。长度对应slice中元素的数目;长度不能超过容量,容量一般是从slice的开始位置到底层数据的结尾位置。
-
例如:
var a []string //声明一个字符串切片
var b = []int{
} //声明一个整型切片并初始化
var c = []bool{
false, true} //声明一个布尔切片并初始化
var d = []bool{
false, true} //声明一个布尔切片并初始化
fmt.Println(a) //[]
fmt.Println(b) //[]
fmt.Println(c) //[false true]
fmt.Println(a == nil) //true
fmt.Println(b == nil) //false
fmt.Println(c == nil) //false
// fmt.Println(c == d) //切片是引用类型,不支持直接比较,只能和nil比较
- 从底层来说 相当于一个结构体
切片的长度及容量
通过len()函数求长度,cap()函数求切片的容量
例如:
arr := [5]int{
1, 2, 3, 4, 5}
s := arr[1:3] // s := a[low:high]
fmt.Printf("s:%v len(s):%v cap(s):%v\n", s, len(s), cap(s))
//s:[2 3] len(s):2 cap(s):4
注意判断切片是否为空,可以通过len(slice)==0来判断。
切片的表达式
变量名[low,high]
其中左包含 右不包含
例如:
arr :=[...]int{
0,1,2,3,4,5,6,7,8,9}
fmt.Println("arr[2:6]=",arr[2:6])
// arr的起始下标2-6 但不包含6即2-5
// arr[2:6]= [2 3 4 5]
fmt.Println("arr[:6]=",arr[:6])
// arr的从0到5 等价于arr[0:6]
// arr[:6]= [0 1 2 3 4 5]
fmt.Println