• Go的切片:长度和容量


    一、切片的声明

    切片可以看成是数组的引用。在 Go 中,每个数组的大小是固定的,不能随意改变大小,切片可以为数组提供动态增长和缩小的需求,但其本身并不存储任何数据。

    /*
     * 这是一个数组的声明
     */
    var a [5]int //只指定长度,元素初始化为默认值0
    var a [5]int{1,2,3,4,5}
    
    /* 
     * 这是一个切片的声明:即声明一个没有长度的数组
     */
    // 数组未创建
    // 方法1:直接初始化
    var s []int //声明一个长度和容量为 0 的 nil 切片
    var s []int{1,2,3,4,5} // 同时创建一个长度为5的数组
    // 方法2:用make()函数来创建切片:var 变量名 = make([]变量类型,长度,容量)
    var s = make([]int, 0, 5)
    // 数组已创建
    // 切分数组:var 变量名 []变量类型 = arr[low, high],low和high为数组的索引。
    var arr = [5]int{1,2,3,4,5}
    var slice []int = arr[1:4] // [2,3,4]
    

    二、切片的长度和容量

    切片的长度是它所包含的元素个数。
    切片的容量是从它的第一个元素到其底层数组元素末尾的个数。
    切片 s 的长度和容量可通过表达式 len(s) 和 cap(s) 来获取。

    s := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} // [0 1 2 3 4 5 6 7 8 9] len=10,cap=10
    s1 := s[0:5] // [0 1 2 3 4] len=5,cap=10
    s2 := s[5:] // [5 6 7 8 9] len=5,cap=5
    

    三、切片追加元素后长度和容量的变化

    1.append 函数

    Go 提供了内建的 append 函数,为切片追加新的元素。

    func append(s []T, vs ...T) []T

    append 的结果是一个包含原切片所有元素加上新添加元素的切片。

    下面分两种情况描述了向切片追加新元素后切片长度和容量的变化。
    Example 1:

    package main
    
    import "fmt"
    
    func main() {
        arr := [5]int{1,2,3,4,5} // [1 2 3 4 5]
        fmt.Println(arr)
        
        s1 := arr[0:3] // [1 2 3]
        printSlice(s1)
        s1 = append(s1, 6)
        printSlice(s1)
        fmt.Println(arr)
    }
    
    func printSlice(s []int) {
        fmt.Printf("len=%d cap=%d %p %v
    ", len(s), cap(s), s, s)
    }

    执行结果如下:

    [1 2 3 4 5]
    len=3 cap=5 0xc000082030 [1 2 3]
    len=4 cap=5 0xc000082030 [1 2 3 6]
    [1 2 3 6 5]

    可以看到切片在追加元素后,其容量和指针地址没有变化,但底层数组发生了变化,下标 3 对应的 4 变成了 6。

    Example 2:

    package main
    
    import "fmt"
    
    func main() {
        arr := [5]int{1,2,3,4} // [1 2 3 4 0]
        fmt.Println(arr)
        
        s2 := arr[2:] // [3 4 0]
        printSlice(s2)
        s2 = append(s2, 5)
        printSlice(s2)
        fmt.Println(arr)
    }
    
    func printSlice(s []int) {
        fmt.Printf("len=%d cap=%d %p %v
    ", len(s), cap(s), s, s)
    }

    执行结果如下:

    [1 2 3 4 0]
    len=3 cap=3 0xc00001c130 [3 4 0]
    len=4 cap=6 0xc00001c180 [3 4 0 5]
    [1 2 3 4 0]

     下面是面试题

  • 相关阅读:
    CSP-S2019游记
    BZOJ4668 冷战
    [ZJOI2007]仓库建设
    CF833B The Bakery
    决策单调性优化DP+分治优化决策单调性
    穿越栅栏 Overfencing
    控制公司 Controlling Companies
    派对灯 Party Lamps
    CSP2019总结
    差分约束
  • 原文地址:https://www.cnblogs.com/zh718594493/p/14060469.html
Copyright © 2020-2023  润新知