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:
package main</p> <p>import "fmt"</p> <p>func main() {</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">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]
The above is the detailed content of Why Do I Get a Slice Bounds Out of Range Error in Go Slicing?. For more information, please follow other related articles on the PHP Chinese website!