go slice原理
/ / 点击原理
go语言
slice是底层数组的一个视图。slice主要参数有3个:
ptr指向slice的首个元素;len表示slice长度;cap表示slice容量。当向
slice里append元素的时候,如果元素个数大于容量的某个百分比,将会扩容。其ptr值也会变。slice扩容的原理其实就是更换该slice底层array数组(因为slice只是某一数组的视图)
定义时与数组的区别
array与slice的定义
1 | // array定义 |
测试
测试1
测试
slice与array定义区别
1 | package main |
输出结果:
1 | array1 type : array |
测试2
测试
slice扩容条件
1 | package main |
输出结果
1 | 0xc000072030 len:4 lastCap:3 cap:6 |
结论:
- 当扩容时,
ptr指针变(即slice这个视图所在的array发生变化)- 只有当
cap大小等于len的时候才会扩容,扩容大小视cap大小而定:cap较小时,直接扩容一倍,稍大时,扩容比例较小
测试3
测试扩容前后的
slice与原slice有什么不同以及两个相同的slice执行某些操作后,另一个的变化情况
1 | package main |
输出结果
1 | arr 0xc00007e080 [0] : 5 len : 2 cap : 16 |
结论
- 未发生扩容,两个
slice相同,改变其中一个slice,另一个也变- 未发生扩容,向其中一个增加元素,另一个len不变
- 发生扩容,新生成
slice,地址变,改变其中一个slice另一个不变
测试4
测试对于两个引用同一个数组但
len不同的slice,能否取到超出自身len的元素
1 | package main |
输出
1 | 4 |
结论:
- 如实例,
s1长度为1,使用[:]操作,能取到后边的数字- 如实例,
s1长度为1,无法使用s1[1]取到对应位置的数据
全文完。