任何人都知道为什么下面的代码运行时不会出现紧急情况,它会在字符串的整个长度上访问索引1。

import (
    "fmt"
)

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

最佳答案

它不会在长度上“切”,而2恰好是长度(等于长度)。

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

由于要 slice string,因此在以下情况下索引在范围内:

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

该表达式:
"hi"[2:]

由于缺少上限,因此默认将其长度设置为2,因此它等效于:
"hi"[2:2]

根据规范,这是完全有效的,并且将导致空string。如果将其更改为"hi"[3:],则它将超出范围并导致编译时错误(因为可以在编译时检查 slice 的恒定string)。

理由是上限是互斥的,例如a[0:0]有效且长度为0,a[0:1]的长度为1,a[0:len(a)]有效,并且长度与a相同。

对于 slice ,下限甚至可以大于 slice 长度(但不得超过 slice 容量)。有关更多详细信息,请参见Slicing: Out of bounds error in Go

关于string - slice 起始位置大于字符串的长度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45299185/

10-16 06:34