Go语言数组month定义12个元素,为何cap与len返回13?
为什么显式指定索引初始化的Go数组长度为13?
问题代码
package main import "fmt" func main() { month := [...]string{1: "Jan", 2: "Fab", 3: "March", 4: "April", 5: "May", 6: "June", 7: "July", 8: "Aug", 9: "Sep", 10: "Oct", 11: "Nov", 12: "Dec"} fmt.Println(cap(month)) summer := month[6:9] Q2 := month[4:7] fmt.Println(cap(Q2)) fmt.Println(len(Q2)) fmt.Println(cap(summer)) fmt.Println(len(summer)) }
运行输出
13 9 3 7 3
原因解析
Go语言中,使用[...]T{索引: 值}的方式初始化数组时,数组的长度和容量会被自动设置为最大索引值 + 1。
你的代码里,数组month的最大索引是12,因此数组长度(len(month))和容量(cap(month))都是12 + 1 = 13。这是因为Go的数组是从索引0开始的连续内存结构,即使你没有显式给索引0赋值,该位置依然会被初始化为对应类型的零值(这里就是空字符串""),这个元素是数组的一部分,所以数组总长度为13。
你可以在代码中添加fmt.Println(month[0])验证,会输出空字符串,证明索引0的元素确实存在。
另外,切片的容量计算也能印证这一点:
Q2 := month[4:7]的容量是13 - 4 = 9,对应输出的9summer := month[6:9]的容量是13 - 6 = 7,对应输出的7
内容的提问来源于stack exchange,提问作者yakob abada
相关产品推荐
相关产品推荐

