在 Go 中进行超出长度的切片
在 Go 中对切片进行切片时,可以指定超出其长度的索引。为什么会发生这种行为以及它的含义是什么?
根据 Go 规范,如果 0 ≤ low ≤ high ≤ len(a),则数组和切片索引被视为在范围内。因此,对于数组或字符串,索引在 len(a) 之前(包括 len(a))有效。然而,对于切片,索引上限是由它们的容量 cap(a) 而不是它们的长度决定的。
在给定的示例中,
a := []int{1, 2, 3} fmt.Println(a[0:]) fmt.Println(a[1:]) fmt.Println(a[2:]) fmt.Println(a[3:]) // doesn't panic - why?? fmt.Println(a[4:]) // panics as expected
a[3:] 不恐慌,因为它引用了底层数组的一部分,该部分超出了切片的当前长度,但仍在其容量范围内。这会产生一个空切片。然而,a[4:] 会触发恐慌,因为它超出了数组的实际长度。
根据规范,访问指定范围之外的索引会导致运行时恐慌。然而,在切片的情况下,容量可以被认为是切片目的的扩展范围,允许索引高达 len(a)。
以上是为什么 Go 切片允许索引超出其长度而不会惊慌?的详细内容。更多信息请关注PHP中文网其他相关文章!