在 Go 中切片时,必须遵守特定的边界以避免错误。此类错误之一是“切片超出范围”错误。当切片表达式导致索引超出允许范围时,就会发生此错误。
在提供的代码片段中:
package main import "fmt" func main() { a := make([]int, 5) printSlice("a", a) b := make([]int, 0, 5) printSlice("b", b) c := b[1:] printSlice("c", c) } func printSlice(s string, x []int) { fmt.Printf("%s len=%d cap=%d %v\n", s, len(x), cap(x), x) }
尝试使用以下命令创建 c 切片时会发生错误表达式 c := b[1:]。这个错误不是由下限(可以等于或大于长度)引起的,而是由上界引起的。
在 Go 中,切片的默认上限是切片操作数的长度。但是,在本例中,切片操作数 b 的长度为 0。因此,默认上限变为 0。因此,表达式 c := b[1:] 导致下限为 1,上限为 0 .
这违反了切片规则,该规则规定对于切片,索引必须满足以下条件条件:
0 <= low <= high <= cap(a)
其中:
在这种情况下,由于 1 不小于或等于为 0 时,表达式会导致越界错误。
要解决此问题,必须在切片时指定显式边界。例如:
c := b[1:1] // Slice from index 1 to 1 (empty slice) c := b[1:2] // Slice from index 1 to 2 (contains the element at index 1) c := b[1:cap(b)] // Slice from index 1 to the capacity of the operand (contains all elements)
以上是Go 切片时如何避免'切片边界超出范围”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!