我有一个string
,当我想获得i
指数的值时,它会发生恐慌,但当我切出相同的string
保持较低的索引值作为长度时,它不会恐慌。想知道1和2有何不同?
func main() {
str := "a"
fmt.Println(str[1]) // 1 this panics
fmt.Println(str[1:]) // 2 this doesn't
}
TLDR;在索引表达式中,索引必须小于长度,并且在切片表达式中,length是有效索引。
在index expression中,指数必须在范围内,否则恐慌。如果0 <= i < length
,该指数在范围内。引用规范:
在索引表达式
a[x]
中......如果
a
不是地图:
- 如果
x
,指数0 <= x < len(a)
在范围内,否则它超出范围
和:
对于string type:
- 如果
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)]
是str[1:1]
相同。结果字符串的长度为high - low = 1 - 1 = 0
:空string
。