任何人都知道为什么下面的代码运行不会惊慌失措,它会在字符串的长度上访问索引。
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 中的越界错误。