转到“切片”问题,请检查以下内容,并在我遗漏某些东西时发表评论。
import "fmt" func main() { s := []int{2, 3, 5, 7, 11, 13} s = s[1:] fmt.Println(s) s = s[2:] fmt.Println(s) s = s[5:] fmt.Println(s) }
输出:
[3 5 7 11 13] [7 11 13] panic: runtime error: slice bounds out of range
以上是合理的。
func main() { s := []int{2, 3, 5, 7, 11, 13} s = s[:1] fmt.Println(s) s = s[:2] fmt.Println(s) s = s[:5] fmt.Println(s) }
[2] [2 3] [2 3 5 7 11]
这是否也应该使数组摆脱s = s [:2]的恐慌?
Go中的Subslicing可让您在切片末尾进行切片,只要它仍在底层阵列的容量范围内即可。您不能 在 该切片的开始 之前 进行切片,但是只要不超过最后分配的索引,就可以在该切片之后进行切片。
例如,s[3:]然后s[:3]工作,但s[4:]随后s[:4]会出现恐慌,因为您正在请求基础数组的索引4到7,该数组仅分配了索引0-5。
s[3:]
s[:3]
s[4:]
s[:4]
有点奇怪,但是这样做确实使您可以最大化任何切片slice = slice[:cap(slice)]。
slice = slice[:cap(slice)]
https://play.golang.org/p/Gq5xoXc3Vd
该语言规范 annotes此,顺便说一句。我在下面用您所使用的简单切片符号来解释它(有一个替代方法,它也指定了新切片的最大索引)。
对于字符串,数组,指向数组或切片a的指针,主表达式a[low : high]构造一个子字符串或切片。如果0 <=低<=高<= cap(a),则索引在范围内,否则它们超出范围。
a[low : high]