英文:
Slice start position greater than length of the string
问题
以下是代码的翻译结果:
有人知道为什么下面的代码可以正常运行,它访问了字符串长度加一的索引。
import (
"fmt"
)
func main() {
fmt.Println("hi"[2:])
}
英文:
Anyone knows why the code below runs without panic, it accesses the index one over the length of the string.
import (
"fmt"
)
func main() {
fmt.Println("hi"[2:])
}
答案1
得分: 3
它不会在长度上进行切片,2恰好是长度(等于它)。
对于数组或字符串,如果满足0 <= low <= high <= len(a)
,则索引处于范围内,否则索引超出范围。
由于你正在对一个字符串进行切片,如果满足以下条件,索引就处于范围内:
0 <= low <= high <= len(a)
这个表达式:
"hi"[2:]
由于缺少上界,它默认为长度,即2,所以它等同于:
"hi"[2:2]
这在规范上是完全有效的,它将得到一个空字符串。如果你将它改为"hi"[3:]
,那么它将超出范围,并导致编译时错误(因为对常量字符串进行切片可以在编译时检查)。
原因是上界是排除在外的,例如a[0:0]
是有效的,并且长度为0,a[0:1]
的长度为1,a[0:len(a)]
是有效的,并且长度与a
相同。
在切片的情况下,下界甚至可以大于切片的长度(但不能超过切片的容量)。更多详情请参考https://stackoverflow.com/questions/33859066/slicing-out-of-bounds-error-in-go/33859638#33859638。
英文:
It does not slices "over" the length, 2 is exactly the length (equals to it).
> For arrays or strings, the indices are in range if 0 <= low <= high <= len(a)
, otherwise they are out of range.
Since you are slicing a string
, indices are in range if:
0 <= low <= high <= len(a)
This expression:
"hi"[2:]
Since the upper bound is missing, it defaults to length, which is 2, so it is equvivalent to:
"hi"[2:2]
This is perfectly valid by the spec, and it will result in an empty string
. If you change it to "hi"[3:]
, then it will be out of range and result in a compile-time error (as slicing a constant string
can be checked at compile-time).
Reasoning is that the upper bound is exclusive, e.g. a[0:0]
is valid and will be 0-length, a[0:1]
will have a length of 1, a[0:len(a)]
valid and will have the same length as a
.
In case of slices, the lower bound can even be greater than the slice length (but must not exceed the slice capacity). For more details, see https://stackoverflow.com/questions/33859066/slicing-out-of-bounds-error-in-go/33859638#33859638.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论