登录
首页 >  Golang >  Go问答

golang切片容量的理解让我困惑

来源:stackoverflow

时间:2024-03-10 16:36:24 354浏览 收藏

小伙伴们有没有觉得学习Golang很有意思?有意思就对了!今天就给大家带来《golang切片容量的理解让我困惑》,以下内容将会涉及到,若是在学习中对其中部分知识点有疑问,或许看了本文就能帮到你!

问题内容

我有一个关于切片帽的问题,代码:

var slice []int
list := []int{1,2,3,4,5}
for _,item := range list {
    slice = append(slice, item)
}
fmt.println(len(slice),cap(slice))

如果 item == 1: len(slice)=1,cap(slice)=1

如果 item == 2: len(slice)=2,cap(slice)= 1*2

如果 item ==3: len(slice) = 3,cap(slice) = 2*2

如果 item == 4:len(slice) = 4,cap(slice) = 4

如果 item == 5:len(切片) = 5,cap(切片) = 4*2

所以输出:

len(切片) = 5,cap(切片) = 8

这没问题,但是当我更改代码时:

var slice []int
slice = append(slice,1,2,3,4,5)
fmt.Println(len(slice),cap(slice))

输出:

len(切片) = 5,cap(切片) = 6

为什么 cap(slice) = 6 ?


正确答案


可以在 src/runtime/slice.go - 第 162 行的 func getslice(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仍小于新切片容量,则取 新的切片容量(附加多个元素)
  • 如果新切片是 小于旧切片容量的两倍,乘以旧切片 容量增加 2
  • 如果旧切片容量大于或等于1024,则新切片容量 切片容量乘以旧切片容量1.25

参考-

今天关于《golang切片容量的理解让我困惑》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>