官方文档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?
...全文
241 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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应该有一些扩容算法,回去研究一下源码看看
资源下载链接为: https://pan.quark.cn/s/67c535f75d4c 在开发 Vue 项目时,跨域问题是一个常见的挑战,主要是由于浏览器的同源策略限制了不同源之间的请求。本文将介绍几种解决跨域问题的方法,适用于使用 vue-cli 脚手架搭建的项目。 在后端服务器上,可以通过修改响应头来解决跨域问题。例如,在 PHP 中,可以设置 Access-Control-Allow-Origin 为 *,以允许所有来源的请求,同时设置 Access-Control-Allow-Methods 为 POST, GET,以允许跨域的 POST 和 GET 请求。代码示例如下: 在前端开发环境中,可以使用 http-proxy-middleware 来设置代理,从而绕过浏览器的同源策略。在 vue-cli 项目中,打开 config/index.js 文件,并在 proxyTable 对象中添加以下配置: 这样,前端的请求路径以 /api 开头时,http-proxy-middleware 会自动将请求转发到目标地址。 axios 是一个常用的 HTTP 库,用于处理前后端交互。可以在项目的 main.js 文件中全局配置 axios,例如设置 POST 请求的 Content-Type: 在组件中,可以通过 this.$axios 发起请求: Fetch API 是另一种发起 HTTP 请求的方式,同样支持跨域。在 Vue 组件中,可以使用以下代码发起 POST 请求: 如果目标服务器只支持 JSONP,可以使用 jQuery 的 $.ajax 方法,并设置 dataType 为 JSONP。例如: Vue 项目中的跨域问题可以通过调整后端服务器的 Header 或在前端使用 http-proxy-middleware 代理来解决。对于支持 JSONP 的 API,还

2,348

社区成员

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

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