任何人都知道为什么下面的代码运行没有恐慌,它会在字符串的长度上访问索引。
import (
"fmt"
)
func main() {
fmt.Println("hi"[2:])
}
答案 0 :(得分:1)
它不会“超过”长度,2正好是长度(等于它)。
对于数组或字符串,索引在范围中
0 <= low <= high <= len(a)
,否则它们超出范围。
由于您正在切片string
,因此索引在以下范围内:
0 <= low <= high <= len(a)
这个表达式:
"hi"[2:]
由于缺少上限,因此默认为length,即2,因此它等效于:
"hi"[2:2]
规范完全有效,它会导致空string
。如果将其更改为"hi"[3:]
,则它将超出范围并导致编译时错误(因为在编译时可以检查切片常量string
)。
推理是上限是排他的,例如a[0:0]
有效且为0长,a[0:1]
长度为1,a[0:len(a)]
有效且长度与a
相同。
在切片的情况下,下限甚至可以大于切片长度(但不得超过切片容量)。有关详细信息,请参阅Slicing: Out of bounds error in Go。