go语言切片

go语言切片

go语言的数组的长度是固定的,所以在某些场景下数组存在着它的局限性

go语言切片的存在就解决了数组长度局限的问题,切片可以看做一个可以自动扩容的数组,但是它跟数组还是有着区别。

切片的声明和舒适化

package main

import "fmt"

func main() {
        // 切片的声明和初始化
        var slice1 []int
        fmt.Println(slice1) // []

        var slice2 = []int{1, 3}
        fmt.Println(slice2) // [1 3]

        // 基于数组来得到切片
        var list = [10]int{1, 2, 3, 4, 56, 7}
        slice3 := list[:5]
        fmt.Println(slice3) //[1 2 3 4 56]
}

切片和数组

go的切片顶层指向的是数组,切片只是数组的一种引用形式。当数组的值发生了改变,则指向该数组的切片对应的值也会发生改变。

直接修改切片的值,就是在修改切片的数组的对应的值

package main

import "fmt"

func main() {
        var list = [...]int{1, 3, 6, 8, 88}
        slice := list[2:4]
        fmt.Println(slice) // [6 8]
        slice[0] = 99
        fmt.Println(slice)  // [99 8]
        fmt.Println(list)   // [1 3 99 8 88]
}

切片的添加和删除

虽然说切片是可以自动扩容的,但是直接使用超过切片长度的索引的对切片进行修改是不可行的,如

package main

import "fmt"

func main() {

        //

        slice := []int{1, 2, 3}
        slice[4] = 4
        fmt.Println(slice)

}

这里会在编译的时候抛出index out of range的错误

为了能够给切片添加元素,go内置了一个append函数

package main

import "fmt"

func main() {

        //

        slice := []int{1, 2, 3}
        slice1 := append(slice, 4)
        fmt.Println(slice1) // [1 2 3 4]
}

append会在原来的切片的最后面追加一个元素,并返回新的切片

go语言暂时没有原生直接支持删除切片的方法,但是可以利用append返回新的切片的特性来生成新的切片,新的切片和原先的切片相比较,就会达成删除切片的目的

package main

import "fmt"

func main() {

        // 利用append来删除切片中的元素
        slice := []int{1, 2, 3, 4, 5, 6, 7}

        slice2 := append(slice[:3], slice[4:]...)
        // slice[4:]... 相当于把slice索引为4和它后面的元素全部加入到切片中
        
        fmt.Println(slice2) // [1 2 3 4 5 7]
        


}

总结一下,切片删除元素的表达式为: append(slice[:index], slice[index+1:]...) index 为原切片想要删除的元素

切片的长度和容量

package main

import "fmt"

func main() {
        // 切片的长度和容量
        var slice1 = []int {1,2,3}
        fmt.Println(slice1) // [1 2 3 ]
        fmt.Printf("slice1的长度为%d,容量为%d\n", len(slice1), cap(slice1))
        // slice1的长度为3,容量为3

        var list = [5]int {1,2,3,4,5}
        slice2 := list[3:]
        fmt.Println(slice2) // [4 5]
        fmt.Printf("slice2的长度为%d,容量为%d\n", len(slice2), cap(slice2))
        // slice2的长度为2,容量为2

        slice3 := append(slice2,6,7,8)
        fmt.Println(slice3) // [1 2 3 6 7 8]
        fmt.Printf("slice3的长度为%d,容量为%d\n", len(slice3), cap(slice3))
        // slice3的长度为5,容量为6
}

切片的长度为切片本身的长度,切片的容量为切片第一个元素在底层数组到数组最后一个元素的长度