Slicing: Out-of-Bounds Error in Go
In Go, slicing involves extracting a portion of an existing slice to create a new slice. When an out-of-bounds error occurs during slicing, it indicates that the specified range exceeds the valid index boundaries for the source slice.
Consider the following code snippet:
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)
}
Running this code results in an out-of-bounds error:
a len=5 cap=5 [0 0 0 0 0] b len=0 cap=5 [] panic: runtime error: slice bounds out of range goroutine 1 [running]: main.main() /private/var/folders/q_/53gv6r4s0y5f50v9p26qhs3h00911v/T/compile117.go:10 0x150
To understand why this error occurs, we need to delve into the rules governing slicing in Go.
Slicing Rules
When slicing a slice or array, the specified indices can be either explicit or implicit. If an index is not explicitly provided, it defaults to a specific value. For slices:
In the given code, the error occurs because the slicing expression for creating the c slice is:
c := b[1:]
This means that the lower bound (1) is explicitly specified, but the upper bound is not. Therefore, it defaults to len(b), which is 0. However, the specified lower bound (1) must be less than or equal to the upper bound (0). This condition is not met, resulting in an out-of-bounds error.
To avoid this error, you can explicitly specify both the lower and upper bounds. For example, to extract only the second element from the b slice, you would write:
c := b[1:2] // c len=1 cap=4 [0]
Alternatively, if you want to extract the entire b slice starting from the second element, you can use:
c := b[1:cap(b)] // c len=4 cap=4 [0 0 0 0]
Disclaimer: All resources provided are partly from the Internet. If there is any infringement of your copyright or other rights and interests, please explain the detailed reasons and provide proof of copyright or rights and interests and then send it to the email: [email protected] We will handle it for you as soon as possible.
Copyright© 2022 湘ICP备2022001581号-3