"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Por qué aparece un error de límites de corte fuera de rango en Go Slicing?

¿Por qué aparece un error de límites de corte fuera de rango en Go Slicing?

Publicado el 2024-12-21
Navegar:192

Why Do I Get a Slice Bounds Out of Range Error in Go Slicing?

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:

  • Un límite inferior faltante tiene como valor predeterminado 0.
  • Un límite superior faltante tiene un valor predeterminado len(slice) (no cap(slice)).

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]
Último tutorial Más>

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