我想知道为什么第二个fmt.Println中的“[1:]”不会使索引超出范围错误?指数1明显超出范围
self
答案 0 :(得分:10)
作为language specification状态,给出切片表达式
a[low : high]
对于数组或字符串,索引在
0 <= low <= high <= len(a)
范围内,否则它们超出范围。 [...]如果索引在运行时超出范围,发生运行时恐慌。
在你的例子中
s[1:]
low
为1
,high
为len(s)
,len(s)
为1
。自low <= len(s)
以来,没有恐慌。
答案 1 :(得分:2)
by definition,不在范围之外:从0到len(s)
的任何位置都可以是s
上范围的开头或结尾。切片端点的工作方式是为了使您可以编写正确的代码而无需进行大量额外检查或算术。特别是,
first = s[:x]
second = s[x:]
将s
分为两部分,其中first
具有x
字节,second
具有字符串的剩余部分,任何值在{0}和x
之间的len(s)
。如果first
,则x == 0
将为空字符串;如果为second
,则x == len(s)
将为空字符串。只有在允许从0到len(s)
的整个范围的值时才会出现这种情况,否则至少有一个可能的拆分位置将无法表达。