go基础(8)切片Slice

定义: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值进去的时候,会取消对原底层数组的引用,会创建一个新的底层数组进行引用,原来的底层数组会被垃圾回收

你可能感兴趣的:(go基础(8)切片Slice)