官方文档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?
...全文
272 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应该有一些扩容算法,回去研究一下源码看看
内容概要:本文围绕基于粒子群优化算法(PSO)优化BP神经网络的表面粗糙度预测模型展开研究,旨在通过智能优化算法提升传统BP神经网络在工程表面粗糙度建模与预测中的性能表现。研究采用PSO算法对BP神经网络的初始权重和阈值进行优化,有效缓解了BP网络易陷入局部最优的问题,增强了模型的泛化能力和预测精度。全文以Matlab为开发平台,构建了完整的PSO-BP神经网络预测系统,并通过实际实验数据验证了该混合模型在收敛速度、稳定性和预测准确性方面的优越性。研究成果适用于机械加工领域中加工参数与表面质量之间的非线性关系建模,为智能制造和工艺优化提供了有效的数据驱动解决方案。 适合人群:具备一定Matlab编程基础,熟悉神经网络和智能优化算法的理工科研究生、科研人员及工程技术人员。 使用场景及目标:①用于机械加工过程中表面粗糙度的高精度预测与加工工艺参数优化;②为智能制造、精密制造与质量控制等领域提供先进的建模与分析工具;③作为PSO与BP神经网络融合的经典案例,服务于算法教学、科研复现与技术创新需求。 阅读建议:建议读者结合提供的Matlab代码深入理解PSO优化BP网络的技术细节,重点掌握种群初始化、适应度函数设计、网络结构搭建、训练过程监控与结果可视化等关键环节,并尝试将该混合优化框架迁移应用于其他回归、预测或系统辨识问题中,进一步拓展其应用边界。

2,352

社区成员

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

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