为了账号安全,请及时绑定邮箱和手机立即绑定

对戈朗片帽感到困惑

对戈朗片帽感到困惑

Go
芜湖不芜 2022-09-12 16:50:49
我有一个关于切片帽的问题,代码:var slice []intlist := []int{1,2,3,4,5}for _,item := range list {    slice = append(slice, item)}fmt.Println(len(slice),cap(slice))如果项目 == 1:len(切片)=1,帽(切片)=1如果项目 == 2:len(切片)=2,帽(切片)= 1*2如果项目 ==3: len(切片) = 3,帽(切片) = 2*2如果项目 == 4:len(切片) = 4,帽(切片) = 4如果项目 == 5:len(切片) = 5,帽(切片) = 4*2所以输出:len(切片) = 5,帽(切片) = 8没问题,但是当我更改代码时:var slice []intslice = append(slice,1,2,3,4,5)fmt.Println(len(slice),cap(slice))输出:len(切片) = 5,帽(切片) = 6为什么帽(切片) = 6 ?
查看完整描述

1 回答

?
慕妹3146593

TA贡献1820条经验 获得超9个赞

您可以在 src/运行时/切片中追加时看到容量计算的算法.go - 第 162 行func growslice(et *_type, old slice, cap int)


    newcap := old.cap

    doublecap := newcap + newcap

    if cap > doublecap {

        newcap = cap

    } else {

        if old.cap < 1024 {

            newcap = doublecap

        } else {

            // Check 0 < newcap to detect overflow

            // and prevent an infinite loop.

            for 0 < newcap && newcap < cap {

                newcap += newcap / 4

            }

            // Set newcap to the requested cap when

            // the newcap calculation overflowed.

            if newcap <= 0 {

                newcap = cap

            }

        }

    }

  • 首先将旧切片容量乘以 2。如果乘以 2 后的容量仍小于新切片容量,则取新切片容量(追加多个 elem)

  • 如果新片小于旧片容量的两倍,请将旧片容量乘以 2

  • 如果旧片容量大于或等于 1024,则新片容量乘以旧片容量乘以 1.25


查看完整回答
反对 回复 2022-09-12
  • 1 回答
  • 0 关注
  • 72 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信