官方文档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?
...全文
251 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应该有一些扩容算法,回去研究一下源码看看
【复现】基于非奇异终端滑模和扩张状态观测器的导弹制导跟踪设计,机动目标制导律设计研究(Matlab代码实现)内容概要:本文介绍了基于非奇异终端滑模控制和扩张状态观测器的导弹制导律设计方法,旨在实现对机动目标的高精度跟踪。通过结合非奇异终端滑模控制的快速收敛性和强鲁棒性,以及扩张状态观测器对系统内外扰动的实时估计与补偿能力,有效提升了导弹制导系统的动态响应性能和抗干扰能力。文中提供了完整的Matlab代码实现,包含仿真模型与结果分析,复现了相关控制策略在导弹拦截场景中的应用效果,适用于高机动目标的精确打击任务。; 适合人群:具备自动控制、飞行器设计或导航制导基础知识的研究生、科研人员及从事航空航天工程的技术人员。; 使用场景及目标:①研究先进滑模控制在导弹制导中的应用;②掌握扩张状态观测器的设计与扰动补偿机制;③通过Matlab仿真复现论文成果,深入理解非奇异终端滑模与观测器融合的制导系统设计流程; 阅读建议:建议读者结合控制理论基础,仔细分析代码结构与算法实现步骤,重点关注滑模面设计、收敛性保障及观测器参数整定部分,并通过调整仿真参数验证系统鲁棒性与适应性。

2,350

社区成员

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

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