• 【笔记】go语言(Slice)切片的概念


    go--(Slice)切片的概念

    //切片是什么,定义一个arr,定义一个s为arr中的2到6,这个s就是一个切片
    arr := [...]int{0,1,2,3,4,5,6,7}
    s := arr[2:6]//半开半闭区间,值为[2 3 4 5]
    //下面的都是Slice
    fmt.Println("arr[2:6]=", arr[2:6])//[2 3 4 5]
    fmt.Println("arr[:6]=", arr[:6])//[0 1 2 3 4 5]
    fmt.Println("arr[2:]=", arr[2:])//[2 3 4 5 6 7]
    fmt.Println("arr[:]=", arr[:])//[0 1 2 3 4 5 6 7]
    

    Slice实际上是array的一个view,是一个视图,对数据进行改动的时候,原始数据也会进行改变,在Slice上面还可以建Slice

    //Slice本身没有数据,是对底层array的一个view
    arr := [...]int{0,1,2,3,4,5,6,7}
    s := arr[2:6]
    s [0] = 10//arr的值变为[0 1 10 3 4 5 6 7]
    

    Slice的层叠

    //在Slice上面还可以建Slice
    s :=arr[2:6]
    s = s[:3]
    s = s[1:]
    s = arr[:]
    

    Slice的扩展

    //Slice的扩展
    
    arr := [...]int{0,1,2,3,4,5,6,7}
    
    s1 := arr[2:6]//正常取值[2 3 4 5]
    
    s2 := s1[3:5]//一样可以取到值[5 6]
    

    原因:Slice的可扩展性,在arr中的数组中的数值,s1进行取值的时候是进行下标的对比,实际上的在s1的下标中,4和5是对应arr中的6和7的,只不过没有显示出来,在s2取值的时候也是进行s2的下标对比,所以就取到了隐藏的下标的对应的值(感觉越说越乱)

    Slice可以向后扩展,但是不能向前扩展

    image

    Slice的实现

    底层就是array,ptr是指向数组中值的位置,len是slice视图的数据,cap是底层数组的长度

    需要注意,s[i]不可以超越len(s),向后扩展不可以超越底层数组cap(s)

    image

    //显示
    arr = [...]int{0,1,2,3,4,5,6,7}
    s1 = arr[2:6]
    s2= s1[3:5]
    fmt.PrintIn(s1[:cap(s1)])
    fmt.Printf("s1=%v, len(s1)=%d, cap(s1)=%d",s1, len(s1), cap(s1))
    fmt.PrintIn("\n")
    fmt.PrintIn(s2[:cap(s2)])
    fmt.Printf("s2=%v, len(s2)=%d, cap(s2)=%d",s2, len(s2), cap(s2))
    fmt.Println("\n")
    
  • 相关阅读:
    非foreach情况下取某一节点的position()
    MorningSale 介绍
    XSLT中的内容自动换列
    十年相伴一首歌
    Navicat的强大自动定时备份
    Xshell6评估期已过的解决方法
    Ext JS继承: 关于object, constructor和prototype
    WCF+Silverlight 异常处理
    Adding/removing fields and columns drag & drop bug's fix
    WCF部署至IIS问题二则
  • 原文地址:https://www.cnblogs.com/jokingremarks/p/15820026.html
Copyright © 2020-2023  润新知