任何人都知道为什么下面的代码运行时不会出现紧急情况,它会在字符串的整个长度上访问索引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/