20210128golang切片的cap,len等(2)关于sl[i:j:k] - ziyouzy/2021blog GitHub Wiki

**注意!!!经测试新切片的底层数组的cap取决于旧切片的cap,而旧切片的cap其实就是底层数组的len如:

a := make([]int, 20, 100)

可以理解成切片len为20,底层数组和切片的容量均为100
同时如果有接口打印底层数组,则底层数组已经包含了100个值为0的元素
基于此切片再进行如下操作:

b :=a[3:8]

则b的len为8,cap为97

c := b[2:1]

则c的len为1,cap为95

d := c[0:1:1]

则d的len为1,cap为1

!!!c := b[2:1]报错了!!!
!!注意!!试验后得出了和之前预想的不同结论:
sl[x:y:z]->x,y,z,x与y确实是下标,表层上是旧切片切割位的起始下标与终止下标,而内在他两个都可以换算成底层数组的起始与终止下标
而z则需要先拿到x所对应底层数组的下标,再基于这个底层数组下标来计算从这开始到底层数组的结束有多少个元素,值是多少 而这个“值”的单位就不再是“下标”了,而是一个“长度”
于是也就可以人为去设定这个长度了如:

e := a[0,12,20]  

不过依然不能是e :=a[0,12,10],因为一切都需要遵循合理性:
之前的c := b[2:1]报错是因为后边的“下标”不可能比前边的“下标”值还小
然而在这里报错的原因则是,新切片总容量cap不可能比现存的元素个数还要小