如下代码切片的cap函数为什么返回的是6不是5?

package main

import "fmt"

func main() {
    var s []int
    printSlice(s) // len=0 cap=0 []

    // 添加一个空切片
    s = append(s, 0)
    printSlice(s) // len=1 cap=1 [0]

    // 这个切片会按需增长
    s = append(s, 1)
    printSlice(s) // len=2 cap=2 [0 1]

    // 可以一次性添加多个元素
    s = append(s, 2, 3, 4)
    printSlice(s) // len=5 cap=6 [0 1 2 3 4]  cap为什么是6?
}

func printSlice(s []int) {
    fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s)
}
阅读 1.1k
1 个回答

cap >= len 。具体是怎么确定的,得去看 golang 的源码。不同版本的策略还可能发生变化。

这个不会每次都开辟恰好够用的内存,为的是可以减少内存开辟跟拷贝的次数。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题