切片起始位置大于字符串长度



任何人都知道为什么下面的代码运行不会惊慌失措,它会在字符串的长度上访问索引。

import (
"fmt"
)
func main() {
fmt.Println("hi"[2:])
}

它不会"超过"长度,2 正好是长度(等于它(。

对于数组或字符串,如果0 <= low <= high <= len(a)索引,则在范围内,否则它们超出范围。

由于您正在切片string,索引在以下情况下在范围内:

0 <= low <= high <= len(a)

此表达式:

"hi"[2:]

由于缺少上限,因此默认为长度,即 2,因此等

同于:
"hi"[2:2]

这在规范中是完全有效的,并且将导致空string。如果将其更改为"hi"[3:],那么它将超出范围并导致编译时错误(因为可以在编译时检查对常量string的切片(。

推理是上限是排他性的,例如a[0:0]有效且长度为 0,a[0:1]长度为 1,a[0:len(a)]有效且长度与a相同。

对于切片,下限甚至可以大于切片长度(但不得超过切片容量(。有关更多详细信息,请参阅 切片:Go 中的越界错误。

最新更新