我有一个string
,当我想获取i
索引处的值时会感到恐慌,但是当我从同一string
切出时,将较低的索引值保留为长度,则它不会惊慌。想知道1和2有何不同?
func main() {
str := "a"
fmt.Println(str[1]) // 1 this panics
fmt.Println(str[1:]) // 2 this doesn't
}
答案 0 :(得分:3)
TLDR;在索引表达式中,索引必须小于长度,在切片表达式中,长度是有效索引。
在index expression中,索引必须在范围内,否则会出现混乱。如果为0 <= i < length
,则索引在范围内。引用规范:
在索引表达式
中a[x]
...如果
a
不是地图:
- 如果
x
,索引0 <= x < len(a)
在范围内,否则超出范围
并且:
对于string type中的a:
- 如果
x
在运行时超出范围,则发生run-time panic
您的str
字符串变量存储一个string
值,该值只有一个字节:'a'
。索引从零开始,因此单个字节的索引为0
。它的长度为1
,因此索引1
上没有元素。
a[low : high]
对于数组或字符串,如果
0 <= low <= high <= len(a)
的索引在范围内,否则它们超出范围。
在切片表达式中,长度是有效索引。因此,在您的情况下,像str
那样索引str[1:]
会导致一个空字符串:""
:
在切片表达式
中a[low : high]
...结果的索引从
0
开始,长度等于high - low
。缺少的
low
索引默认为零;缺少的high
索引默认为切片操作数的长度。
因此str[1:]
与str[1:len(str)]
的{{1}}相同。结果字符串的长度为str[1:1]
:空的high - low = 1 - 1 = 0
。