官方文档Go语言之旅中的向切片追加元素为什么len和cap不相等

韩明宇 2018-11-15 03:52:23

package main

import "fmt"

func main() {
var s []int
printSlice(s)

// append works on nil slices.
s = append(s, 0)
printSlice(s)

// The slice grows as needed.
s = append(s, 1)
printSlice(s)

// We can add more than one element at a time.
s = append(s, 2, 3, 4)
printSlice(s)
}

func printSlice(s []int) {
fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s)
}


得到的结果是
len=0 cap=0 []
len=1 cap=1 [0]
len=2 cap=2 [0 1]
len=5 cap=6 [0 1 2 3 4]

底层数组也只有5个元素啊,为什么最后的cap是6而不是5?
...全文
235 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
maquan 2018-12-04
  • 打赏
  • 举报
回复
如果需求的新容量超过原有容量的两倍,则直接以需求的新容量为准。本例中,结果应该为 5。 参考源代码: https://github.com/golang/go/blob/020a18c545bf49ffc087ca93cd238195d8dcc411/src/runtime/slice.go#L97 然后,新的容量还要按字节对齐。对于本例,最终的结果为 6。 参考源代码: https://github.com/golang/go/blob/020a18c545bf49ffc087ca93cd238195d8dcc411/src/runtime/slice.go#L152 https://github.com/golang/go/blob/020a18c545bf49ffc087ca93cd238195d8dcc411/src/runtime/msize.go#L16 https://github.com/golang/go/blob/020a18c545bf49ffc087ca93cd238195d8dcc411/src/runtime/sizeclasses.go#L83
仗剑_天涯 2018-11-19
  • 打赏
  • 举报
回复
因为append会判断原数组的cap是否能够容纳新添加的数据,如果不能则会重新分配当前空间 两倍大小的空间存放数据,但是为啥cap是6而不是8这点我也好奇怪
pirlo-san 2018-11-19
  • 打赏
  • 举报
回复
引用 1 楼 仗剑_天涯的回复:
因为append会判断原数组的cap是否能够容纳新添加的数据,如果不能则会重新分配当前空间 两倍大小的空间存放数据,但是为啥cap是6而不是8这点我也好奇怪
不一定是两倍,append应该有一些扩容算法,回去研究一下源码看看

2,190

社区成员

发帖
与我相关
我的任务
社区描述
go语言学习与交流版
社区管理员
  • go语言社区
  • Freeman Z
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧