20210128golang切片的cap,len等(1) - ziyouzy/2021blog GitHub Wiki
这是切片的数据结果问题
切片是引用类型,初始化方式为:
sl :=[]int{0,1,2,3,4,5}
他的内部字段有3个,一个是所指向数组的指针
另外两个一个len,一个是cap
len代表当前切片长度
cap代表切片总容量
cap有内置自动扩种机制
同时也能用make来构造切片:
make([]T, size, cap)
size是指定构造出的切片初始状态会拥有几个元素,并给各个元素赋予默认值
而cap就是cap了
具体如下
func main() {
a := make([]int, 2, 10)
fmt.Println(a) //[0 0]
fmt.Println(len(a)) //2
fmt.Println(cap(a)) //10
}
然后再重点聊下slice[i:j:k]中的k,基于如下文章思考:
https://www.cnblogs.com/sparkdev/p/10704614.html
这是对切片截取的相关操作
i和j没什么可说的,i为开始截取的下标index,j为截取的长度,k为设定新切片的总容量(k的取值以及其导致的操作并不会修改底层数组)
k可以省略,省略的话k的值为底层数组的总长度-i(index下标)所处底层数组下标的位置
而如果此切牌你本身不是最初的切片
(最初切片创建了底层数组,并指向这个底层数组,这个新切片基于最初切片创建并指向同一底层数组)
假设原切片、及其底层数组值为{0,1,2,3,4,5,6,7,8,10},新切片值为{1,2,3,4,5,6}
如果再对新切片进行sl =sl[0:3],则新切片会变成{1,2,3},共同的底层数组依然是{0,1,2,3,4,5,6,7,8,10}
这里需要强调的是k的默认值并不是10-0,而是10-1,因为取“0”的话并不是底层数组下标的正确位置,1才是
已经过实际代码验证
或者说每次进行切割操作时,说需要先把i(第一个参数/index)转化成底层数组的index,再进行相关的逻辑计算才行,无论这个切片是第几次基于旧切片构造出来的
如果对新切片进行sl =sl[0:3:3],则新切片会变成{1,2,3},共同的底层数组依然是{0,1,2,3,4,5,6,7,8,10},而新sl的容量则会是刚刚能容纳内部数据的3,这是个节省系统开销的操作,同样的需要先把“0”转化为底层切片的“1”,len设定为“3”,cap则人工设定为“3”,就不需要默认值的自动计算操作了