美文网首页
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