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

时间:2017-07-25 09:28:07

标签: string go slice

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

import (
    "fmt"
)

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

1 个答案:

答案 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