定义:Go 语言切片是对数组的抽象。
Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go 中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。
(其实跟js和PHP的数组是差不多的,可扩容,但是go的切片一组数据类型是一样的)
slice := make([]T, length, capacity)
make:关键词,
length:切片长度
capacity:切片的容量(可以不用给容量大小,不给的话,容量默认大小就是切片长度)
第一种定义方式:
//设置一个长度为1,容量为2的切片
slice := make([]int,1,2)
slice[0] = 1
第二种定义方式:
初始化定义
slice2 := []string{"小埋", "哆啦A梦", "蜡笔小新", "小葵"}
for _,v := range slice2{
fmt.Println(v)
}
也可以这样往里面添加值:
slice1 := []string{}
slice1 = append(slice1, "少林功夫好耶,真滴好")
获取切片某一个片段的值:
slice2 := []string{"小埋", "哆啦A梦", "蜡笔小新", "小葵"}
slice3 := slice2[0:2]//表示在原切片slice2 上从下标0开始获取长度2的切片
for _, v := range slice3 {
fmt.Println(v)
}
//结果为:小埋 哆啦A梦
注意一点,从某一个切片截取的切片值覆给另一个切片,这个操作是引用传递,(简单说如果被赋值的切片的值改变了 ,那么原切片的值也会发生改变)
slice2 := []string{"小埋", "哆啦A梦", "蜡笔小新", "小葵"}
slice3 := slice2[0:2]
slice3[0] = "娜娜子"
slice3[1] = "美伢"
for _, v := range slice2 {
fmt.Println(v)
}
//结果:slice2 下标1的值和下标2的值改为了娜娜子和美伢
切片之间的拷贝
关键字:copy()
slice2 := []string{"小埋", "哆啦A梦", "蜡笔小新", "小葵"}
slice4 := make([]string, len(slice2), cap(slice2))//定义了slice4,其长度等于slice2 长度,容量等于slice2 的容量(len():获取长度,cap():获取容量)
copy(slice4, slice2)
for _, v := range slice4 {
fmt.Println(v)
}
向切片添加元素
关键词:append()
var nums []int
nums = append(nums, 1)
nums = append(nums, 2)
nums = append(nums, 3)
删除切片
切片没有直接删除的函数,所以需要自己写一个:
//删除美伢
nameList := []string{"蜡笔小新", "美伢", "园长老大", "风间"}
var nameList5 []string
//删除切片里面值为美伢的
for k, v := range nameList {
if v == "美伢" {
nameList5 = append(nameList5, nameList[0:k]...)
nameList5 = append(nameList5,nameList[k+1 : len(nameList)]...)
}
}
fmt.Println(nameList5)//[蜡笔小新 园长老大 风间]
切片说明
切片本身为一个struct结构体,切片是对数组一个连续片段的引用,所以切片是一个引用类型,它内部实现的数据结构通过指针引用底层数组,设定相关属性将数据读写操作限定在指定的区域内
如果切片已经到达最大容量,继续append数据进去,则会自动扩容,
如果切片长度有没有大于1024,没有就扩大原来的两倍,有则扩大1.25倍把切片1拷贝给切片2(copy(slice2,slice1)),如果修改切片一种的某个值,切片2并不会改变
nameList := []string{"蜡笔小新", "美伢", "园长老大", "风间"}
nameList2 := make([]string, len(nameList), cap(nameList))
copy(nameList2, nameList)
nameList[1] = "野原广志"
fmt.Println(nameList2)//[蜡笔小新 美伢 园长老大 风间]
- 当切片已经达到最大容量在append值进去的时候,会取消对原底层数组的引用,会创建一个新的底层数组进行引用,原来的底层数组会被垃圾回收