slice超capacity还是有些不懂的地方
来源:3-3 切片的操作
慕婉清9943996
2021-03-03 15:32:22
我的理解是,一旦超了capacity,GO会生成一个不知名的新数组b,把旧数组a的数据复制到b上,而且这个b还是不知道名字的,也不知道他capacity多大,我们没法使用的是吗?如果我要实现数组的动态扩容或者缩小,还是要自己手动写动态数组的代码吗
1回答
1.capacity的大小可以通过cap(slice)查看
2.已经拿到slice了 就可以对底层的数组进行操作,而不用管他操作的数组是哪一个。
通常情况下 是不会在意操作的数组是哪一个,只管这个切片所对应的数组里的数据是否是准确的
3.数组扩容可以直接通过slice进行操作,具体方法就是使用append(slice,T),在数组len不超过cap的情况下将依然操作同一个数组,超过的情况下就会改变slice底层数组的指针,指向新数组,但里面的元素将被保留
4.由于数组这种结构的特殊性,所有改变数组空间大小的操作其实都是需要在内存中进行重新申请的,这就是你说的生成新数组,append方法如果是对切片操作,只要len不超过cap就不会改变数组的大小,而当len超过cap的时候就会触发数组的扩容机制,这个时候会在内存中重新申请一块更大的数组空间,之后就是对原数组内容的复制,使得数组内容依然是你期望的。
至于cap的扩容大小,从观察来看 是每次扩容之前的2倍大小,如果之前的cap是16,触发扩容后cap将变为32
相似问题