切片返回意外长度

yak*_*ada 1 go

我\xe2\x80\x99m正在学习Golang,我停了下来并让我困惑。

\n
package main\n\nimport "fmt"\n\nfunc main() {\n    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"}\n    fmt.Println(cap(month))\n    summer := month[6:9]\n    Q2 := month[4:7]\n    fmt.Println(cap(Q2))\n    fmt.Println(len(Q2))\n\n    fmt.Println(cap(summer))\n    fmt.Println(len(summer))\n}\n\n
Run Code Online (Sandbox Code Playgroud)\n

输出是

\n
13\n9\n3\n7\n3\n
Run Code Online (Sandbox Code Playgroud)\n

月切片有 12 个元素,但cap(month)len(month)返回13,为什么?

\n

眠りネ*_*ネロク 5

首先,month数组\xe2\x80\x93 不是切片 \xe2\x80\x93 ,它的类型[13]string。只需查看其类型,我们就知道它有 13 个元素(长度),而切片的类型为[]string

\n

数组和切片索引从零开始,而不是从一开始。由于您没有指定string索引处的值0数组索引处

\n
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"}\n
Run Code Online (Sandbox Code Playgroud)\n

它相当于:

\n
month := [13]string{0: "", 1: "Jan", 2: "Fab", 3: "March", 4: "April", 5: "May", 6: "June", 7: "July", 8: "Aug", 9: "Sep", 10: "Oct", 11: "Nov", 12: "Dec"}\n
Run Code Online (Sandbox Code Playgroud)\n

也就是说,零string(即空字符串)作为第一个元素。

\n

请注意,我已替换...13. 省略号告诉编译器根据初始值设定项推断数组的长度(这是其类型的一部分)。

\n

即使您使用切片文字而不是数组文字作为初始值设定项:

\n
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"}\n
Run Code Online (Sandbox Code Playgroud)\n

(在这种情况下是切片)的长度month仍然是13与上述相同的原因。

\n