切片可以访问超出范围的另一个切片,但索引超出范围会导致恐慌
Slice can access another slice out of range but indexing out of range causes panic
我的代码:
package main
import (
"fmt"
)
func main() {
a := [10]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
b := a[1:4]
fmt.Println("a:", a)
fmt.Println("b:", b)
// Works fine even though c is indexing past the end of b.
c := b[4:7]
fmt.Println("c:", c)
// This fails with panic: runtime error: index out of range [4] with length 3
// d := b[4]
}
输出:
a: [0 1 2 3 4 5 6 7 8 9]
b: [1 2 3]
c: [5 6 7]
如果我取消注释包含 d := b[4]
的行,则会导致此错误:
panic: runtime error: index out of range [4] with length 3
我的问题:
为什么可以访问 b[4:7]
,即使索引 4 超出了长度为 3 的 b
的范围,但不能访问 b[4]
?什么 Go 语言规则解释了这种行为?
相关规则:Spec: Index expressions and Spec: Slice expressions.
简而言之:索引时,索引必须小于长度。切片时,上索引必须小于等于容量.
索引时:a[x]
the index x
is in range if 0 <= x < len(a)
, otherwise it is out of range
切片时:a[low: high]
For arrays or strings, the indices are in range if 0 <= low <= high <= len(a)
, otherwise they are out of range. For slices, the upper index bound is the slice capacity cap(a)
rather than the length.
当你这样做时:
b := a[1:4]
b
将是一个与 a
共享支持数组的切片,b
的长度将为 3
,其容量将为 9
.因此,稍后将 b
切片甚至超出其长度,直至其容量 9
是完全有效的。但是在索引时,你总是可以只索引切片长度覆盖的部分。
我们使用索引来访问切片或数组的当前元素,如果我们想要创建数组或切片的片段,或者如果我们想要扩展[=46=,我们使用切片] 它。扩展它意味着我们想要更大的部分(但支持数组仍然覆盖的部分)。
我的代码:
package main
import (
"fmt"
)
func main() {
a := [10]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
b := a[1:4]
fmt.Println("a:", a)
fmt.Println("b:", b)
// Works fine even though c is indexing past the end of b.
c := b[4:7]
fmt.Println("c:", c)
// This fails with panic: runtime error: index out of range [4] with length 3
// d := b[4]
}
输出:
a: [0 1 2 3 4 5 6 7 8 9]
b: [1 2 3]
c: [5 6 7]
如果我取消注释包含 d := b[4]
的行,则会导致此错误:
panic: runtime error: index out of range [4] with length 3
我的问题:
为什么可以访问 b[4:7]
,即使索引 4 超出了长度为 3 的 b
的范围,但不能访问 b[4]
?什么 Go 语言规则解释了这种行为?
相关规则:Spec: Index expressions and Spec: Slice expressions.
简而言之:索引时,索引必须小于长度。切片时,上索引必须小于等于容量.
索引时:a[x]
the index
x
is in range if0 <= x < len(a)
, otherwise it is out of range
切片时:a[low: high]
For arrays or strings, the indices are in range if
0 <= low <= high <= len(a)
, otherwise they are out of range. For slices, the upper index bound is the slice capacitycap(a)
rather than the length.
当你这样做时:
b := a[1:4]
b
将是一个与 a
共享支持数组的切片,b
的长度将为 3
,其容量将为 9
.因此,稍后将 b
切片甚至超出其长度,直至其容量 9
是完全有效的。但是在索引时,你总是可以只索引切片长度覆盖的部分。
我们使用索引来访问切片或数组的当前元素,如果我们想要创建数组或切片的片段,或者如果我们想要扩展[=46=,我们使用切片] 它。扩展它意味着我们想要更大的部分(但支持数组仍然覆盖的部分)。