美文网首页
Slice使用陷井和心得总结

Slice使用陷井和心得总结

作者: 夜空中乄最亮的星 | 来源:发表于2021-06-07 18:36 被阅读0次

    根据数组生成切片

    新的切片:s := array[low,high,max]

    func main(){
        arr :=[3]int{1,2,3}
        //s1:=arr[3]   数组不能越界,毋庸置疑
        s2:=arr[3:]
        s3:=arr[3:3]
        s4:= arr[3:3:3]
        fmt.Println(s2,s3,s4) 
    }
    输出为 [] [] []
    
    

    新手可能会认为lowhighmax只能取到数组中最大的索引值2,为啥还能取到3呢,其实并不是这样,需要注意的是lowhighmax的取值范围

    0 <= low <= high <= max <= cap(array)
    

    我们再看一个例子就明白了:

    func main(){
       arr :=make([]int,3,5)
        //s1:=arr[3] 取值越界
        s2:=arr[3:]
        //s21:=arr[4:] high超出取值范围  // low=4 high=3 max=5
        s3:=arr[3:4]  // low=3 high=4 max=5
        s4:=arr[4:5]  // low=4 high=5 max=5
        s5:=arr[5:5]  // low=5 high=5 max=5
        s6:= arr[5:5:5] // low=5 high=5 max=5
        fmt.Println(s2,s3,s4,s5,s6) 
    }
    输出:[] [0] [0] [] []
    

    对于满足取值范围:0 <= low <= high <= max <= 5,arr[4:] 为什么会报错呢?~
    原因是:arr[4:] 中 high是默认的,len(arr),也就是s21=arr[4:3]因此会报错!
    所以请注意默认值:

    len=0  
    high=len(arr) 
    max=cap(arr)
    

    切片的长度和容量的计算公式为:

    len = high -low
    cap = max-low
    

    下面的代码输出是什么?

    func main() {
        slice := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
        s1 := slice[2:5:6] //2 3 4  (5)
        s2 := s1[2:3:4] //4  (5)
    
        s2 = append(s2, 100)  //4 100
        s2 = append(s2, 200)  // 4 100 200
    
        s1[2] = 20 //2 3 20
    
        fmt.Println(s1) //2 3 20
        fmt.Println(s2) // 4 100 200
        fmt.Println(slice) //0 1 2 3 20 100 6 7 8 9
    
    }
    
    输出结果:
    [2 3 20]
    [4 100 200]
    [0 1 2 3 20 100 6 7 8 9]
    

    总结一下如何能更精确的计算出切片值:

    1. slice[low:high:max] 注意取值范围,并计算出len和cap,特别需要注意max被省略的情况
    2. 根据切片生成的切片 lowhighmax取值范围是由上层切片限制,而不是底层原始数组。这里s2是根据s1生成的切片,s2的lowhighmax 会被s1限制(本示例中s2的max 最大为4)
    3. 当遇到append时注意观察cap容量是否充足,如果不够,会进行扩容,不会影响底层数组。
    4. 如果容量充足,此时的append操作会影响原始数组

    相关文章

      网友评论

          本文标题:Slice使用陷井和心得总结

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