切片的出现目的:
解决数组的局限性
例如:改变数组的长度、给数组增加新的元素
切片
切片(Slice)是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封装。切片是一个引用类型,它的内部结构包含地址、长度和容量。
切片其实是一个结构体包括长度,容量,底层数组
切片的定义
var name[ ]T,其中name:表示变量名。T:表示切片中的元素类型。
func main() { // 声明切片类型 var x []string //声明一个字符串切片 var y = []int{} //声明一个整型切片并初始化 var m = []bool{false, true} //声明一个布尔切片并初始化 var n = []bool{false, true} //声明一个布尔切片并初始化 fmt.Println(x) //[] fmt.Println(y) //[] fmt.Println(m) //[false true] fmt.Println(x == nil) //true fmt.Println(y == nil) //false fmt.Println(m == nil) //false // fmt.Println(m == n) //切片是引用类型,不支持直接比较,只能和nil比较 }
切片的长度和容量
通过使用内置的len()函数求长度,使用内置的cap()函数求切片的容量。
切片表达式
切片表达式从字符串、数组、指向数组或切片的指针构造子字符串或切片。它有两种变体:一种指定low和high两个索引界限值的简单的形式,另一种是除了low(左包含)和high(右不包含)索引界限值外还指定容量的完整的形式。
完整切片表达式
a[low:high:max]
简单形式
a[low:high]
a[2:] // 等同于 a[2:len(a)] a[:3] // 等同于 a[0:3] a[:] // 等同于 a[0:len(a)]
make()函数构造切片
动态创建一个切片,使用内置的make()函数
make([]T,size,cap)
T:切片的元素类型
size:切片中元素的数量
cap:切片的容量
func main(){ a:=make([]int ,2,10) fmt.println(a) //[0 0] fmt.println(len(a)) //2 fmt.println(cap(a)) //10
}
切片的本质就是对底层数组的封装,它包含了三个信息:底层数组的指针、切片的长度(len)和切片的容量(cap)
判断切片是否为空:使用len(s)==0来判断。
切片不能直接比较
切片之间是不能比较的,我们不能使用==操作符来判断两个切片是否含有全部相等元素。 切片唯一合法的比较操作是和nil比较。 一个nil值的切片并没有底层数组,一个nil值的切片的长度和容量都是0。但是我们不能说一个长度和容量都是0的切片一定是nil。对一个切片的修改会影响另一个切片的内容。
切片遍历
func main() {
s := []int{1, 3, 5}
for i := 0; i < len(s); i++ {
fmt.Println(i, s[i])
}
for index, value := range s {
fmt.Println(index, value)
}
}
append()方法为切片添加元素
可以一次添加一个,也可以一次添加多个。
当底层数组容量不够时,开始扩容append()函数将元素追加到切片的最后并返回该切片。
切片numSlice的容量按照1,2,4,8,16这样的规则自动进行扩容,每次扩容后都是扩容前的2倍。
func main(){
var s []int
s = append(s, 1) // [1]
s = append(s, 2, 3, 4) // [1 2 3 4]
s2 := []int{5, 6, 7}
s = append(s, s2...) // [1 2 3 4 5 6 7]
}
使用copy()函数复制切片
copy(destSlice, srcSlice []T)
其中:
srcSlice: 数据来源切片
destSlice: 目标切片
func main() {
// copy()复制切片
a := []int{1, 2, 3, 4, 5}
c := make([]int, 5, 5)
copy(c, a) //使用copy()函数将切片a中的元素复制到切片c
fmt.Println(a) //[1 2 3 4 5]
fmt.Println(c) //[1 2 3 4 5]
c[0] = 1000
fmt.Println(a) //[1 2 3 4 5]
fmt.Println(c) //[1000 2 3 4 5]
}
从切片中删除元素
从切片a中删除索引为index的元素,操作方法是a = append(a[:index], a[index+1:]…)
func main() {
// 从切片中删除元素
a := []int{30, 31, 32, 33, 34, 35, 36, 37}
// 要删除索引为2的元素
a = append(a[:2], a[3:]...)
fmt.Println(a) //[30 31 33 34 35 36 37]
}
总结一下就是:要从切片a中删除索引为index的元素,操作方法是a = append(a[:index], a[index+1:]...)