Corte: error fuera de límites en Go
En Go, cortar implica extraer una parte de un corte existente para crear un nuevo rebanada. Cuando se produce un error fuera de límites durante la división, indica que el rango especificado excede los límites de índice válidos para la división de origen.
Considere el siguiente fragmento de código:
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)
}
La ejecución de este código genera un error de fuera de límites:
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
Para comprender por qué ocurre este error, debemos profundizar en las reglas que rigen el corte en Go.
Rebanar Reglas
Al dividir un segmento o una matriz, los índices especificados pueden ser explícitos o implícitos. Si no se proporciona explícitamente un índice, el valor predeterminado es un valor específico. Para sectores:
En el código proporcionado, el error se produce porque la expresión de corte para crear el segmento c es:
c := b[1:]
Esto significa que el límite inferior (1) se especifica explícitamente, pero el límite superior no. Por lo tanto, el valor predeterminado es len(b), que es 0. Sin embargo, el límite inferior especificado (1) debe ser menor o igual a el límite superior (0). Esta condición no se cumple, lo que genera un error de fuera de límites.
Para evitar este error, puede especificar explícitamente los límites superior e inferior. Por ejemplo, para extraer solo el segundo elemento del segmento b, escribiría:
c := b[1:2] // c len=1 cap=4 [0]
Alternativamente, si desea extraer todo el segmento b comenzando desde el segundo elemento, puede usar:
c := b[1:cap(b)] // c len=4 cap=4 [0 0 0 0]
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3