我\xe2\x80\x99m正在学习Golang,我停了下来并让我困惑。
\npackage 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\nRun Code Online (Sandbox Code Playgroud)\n输出是
\n13\n9\n3\n7\n3\nRun Code Online (Sandbox Code Playgroud)\n月切片有 12 个元素,但cap(month)和len(month)返回13,为什么?
首先,month数组\xe2\x80\x93 不是切片 \xe2\x80\x93 ,它的类型是[13]string。只需查看其类型,我们就知道它有 13 个元素(长度),而切片的类型为[]string。
数组和切片索引从零开始,而不是从一开始。由于您没有指定string索引处的值0数组索引处
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"}\nRun Code Online (Sandbox Code Playgroud)\n它相当于:
\nmonth := [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"}\nRun Code Online (Sandbox Code Playgroud)\n也就是说,零值string(即空字符串)作为第一个元素。
请注意,我已替换...为13. 省略号告诉编译器根据初始值设定项推断数组的长度(这是其类型的一部分)。
即使您使用切片文字而不是数组文字作为初始值设定项:
\nmonth := []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"}\nRun Code Online (Sandbox Code Playgroud)\n(在这种情况下是切片)的长度month仍然是13与上述相同的原因。