根据数组生成切片
新的切片: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)
}
输出为 [] [] []
新手可能会认为low
、high
、max
只能取到数组中最大的索引值2,为啥还能取到3呢,其实并不是这样,需要注意的是low
、high
、max
的取值范围
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]
总结一下如何能更精确的计算出切片值:
-
slice[low:high:max]
注意取值范围,并计算出len和cap,特别需要注意max被省略的情况 - 根据切片生成的切片
low
、high
、max
取值范围是由上层切片限制,而不是底层原始数组。这里s2是根据s1生成的切片,s2的low
、high
、max
会被s1限制(本示例中s2的max 最大为4) - 当遇到append时注意观察cap容量是否充足,如果不够,会进行扩容,不会影响底层数组。
- 如果容量充足,此时的append操作会影响原始数组
网友评论