You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于Go语言中0长度切片创建及重新切片行为不符合预期的技术咨询

理解Go切片的len、cap与底层数组关系

这其实是Go切片的三个核心属性在起作用——底层数组指针、长度(len)和容量(cap),咱们一步步拆解你的问题:

疑问1:为什么s1显示[1],而s显示[]?

先拆解代码里的关键步骤:

  • s := make([]int, 0, 10):这句创建的切片s,底层关联着一个拥有10个int元素的数组,但切片自身的len(对外可见的元素数量)是0,cap(底层数组可使用的最大空间)是10。简单说就是:底层数组已经存在,但s目前“看不到”任何元素。
  • s1 := s[0:1]:这是基于s生成的新切片s1,它的len被设为1(切片范围是左闭右开的[0,1),即包含索引0的元素),cap依然是10(因为从起始索引0到底层数组末尾还有10个位置)。最重要的是:s和s1共享同一个底层数组。
  • s1[0] = 1:这行代码直接修改了共享底层数组的第0个元素的值。但s的len还是0,而fmt.Println打印切片时,只会输出切片len范围内的元素。所以s因为len=0显示[],s1因为len=1显示[1]。

疑问2:为什么s[0:10]显示有值,而s依然是[]?

  • s[0:10]是创建了一个全新的切片,这个新切片的len被设置为10,cap也是10。它同样指向原来的底层数组,所以能展示底层数组的全部10个元素——第一个元素已经被s1[0]=1修改为1,剩下的9个是int类型的默认值0,所以输出[1 0 0 0 0 0 0 0 0 0]。
  • 关键要注意:重新切片的操作不会修改原切片s的任何属性,s的len仍然是0,cap还是10。切片的len才是决定它对外展示多少元素的核心,底层数组的内容变化并不会自动改变原切片的len值。

如果想让s也能看到这个修改后的元素,可以手动调整s的len,比如执行s = s[:1],这时候s的len变成1,再打印就会显示[1]了。

内容的提问来源于stack exchange,提问作者wenningzhang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 19:57:41