切片注意点及其底层原理

切片在Go语言中是数组的引用,具有长度和容量属性。它允许在运行时动态调整长度,当超出容量限制时,会重新分配更大的数组。切片值拷贝传递,但操作不影响底层数组。make函数用于创建切片,并能在超出容量时按策略扩容,通常新容量是原容量的两倍,但对大切片可能会更保守。
摘要由CSDN通过智能技术生成

slice本身并非动态数组或数组指针。它内部通过指针引用底层数组,设定相关属性将数据读写操作限定在指定区域内。

type slice struct {
    array unsafe.Pointer
    len int
    cap int
}

属性cap表示切片所引用数组片段的真实长度,len用于限定可读的写元素数量。另外,数组必须addressable,否则会引发错误

切片:

1.切片是数组的一个引用,因此切片是引用类型。但自身是结构体,值拷贝传递。

  1. 切片的长度可以改变,因此,切片是一个可变的数组。

  2. 切片遍历方式和数组一样,可以用len()求长度。表示可用元素数量,读写操作不能超过该限制。

  3. cap可以求出slice最大扩张容量,不能超出数组限制。0 <= len(slice) <= len(array),其中array是slice引用的数组。

  4. 切片的定义:var 变量名 []类型,比如 var str []string var arr []int。

  5. 如果 slice == nil,那么 len、cap 结果都等于 0。

切片的内存布局:

make函数允许在运行期动态指定数组的长度,绕开了数组类型必须使用编译器常量的限制

数据被追加到原底层数组,如超出cap限制,则为新切片对象重新分配数组

注意:

1、是超出切片cap限制,而非底层数组长度限制,因为底层数组可大于cap

2、新分配的数组长度是原cap的2倍,而非原数组的两倍

(并非总是2倍,对于较大的切片,会尝试扩容1/4,以节约内存

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值