golang 基础(fourteen)slice

作者: zidea | 来源:发表于2019-03-18 05:47 被阅读45次
    square-gopher.png

    (slice)切片


    slice.png

    slice 是动态地表述数组的片段
    每一个 slice 都包含一个指向数组的片段的指针 ptr,一个 len 用于表示数组片段的长度以及 cap 表示片段可扩展能力。

    slice_illustration.JPG
    • s := []int{3,4,5} 有初始化值的初始化
    • s := []int{} 没有初始值的初始化,分配内存
    • s := []int 声明一个 slice ,且暂不分配内存
      这样声明好处当一个slice在随后可能不被使用,所以暂时不分配内存给他。
    • s := make([]int,5,10) 没有初始值的 slice 初始化,分配内存指定 slice 长度并且指定数组的承载能力
    func main(){
        arr := [...]int{0,1,2,3,4,5,6,7}
        s := arr[2:6] //[2 3 4 5]
        fmt.Println(s)
    }
    

    s 就可以理解为数组 arr 的切片,在计算机中通常截取是半开半闭原则所以 2 是被包含进去而 6 不被包含。

    fmt.Println("arr[2:6] = ",arr[2:6])
        fmt.Println(arr[2:])
        fmt.Println(arr[:6])
        fmt.Println(arr[:])
    

    结果自己尝试吧

    slice 的长度和可扩展

    s := arr[2:6]
        fmt.Println(cap(s)) //6
        fmt.Println(len(s)) //4
    

    长度就不解释,扩展是就是 arr 在 slice 后面还剩几个元素就是 slice 几位可扩展。

    还可以对 slice 进行取 slice

    s = s[:3]
        fmt.Println(s) //[2 3 4]
        s = s[2:]//[4]
        fmt.Println(s)
    

    那么可以进一步研究一下下面的代码,看一看扩展的用途,这里注意一下 s1 从 s 中进行取值,取值范围已经超出的 s 的长度,但是因为没有超出其扩展,所以 s1 会从数组 arr 进行取值。

    s := arr[2:6]
        fmt.Println(cap(s)) //6
        fmt.Println(len(s)) //4
    
        s1 := s[3:5]
        fmt.Println("s = ",s)
        fmt.Println("s1 = ",s1)
    
    s =  [2 3 4 5]
    s1 =  [5 6]
    
    slice_extension.JPG slice_extension_02.JPG
    • s 的值为[2,3,4,5], s2 的值为[5,6]
    • slice 可以向后扩展,不可以向前扩展
    • s[i]不可以超越len(s),向后扩展不可以超越底层数组cap(s)

    相关文章

      网友评论

        本文标题:golang 基础(fourteen)slice

        本文链接:https://www.haomeiwen.com/subject/ipjmmqtx.html