"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 > ¿Cómo se comporta el rehabilitación con las matrices subyacentes en rodajas de GO?

¿Cómo se comporta el rehabilitación con las matrices subyacentes en rodajas de GO?

Publicado el 2025-02-06
Navegar:613

How Does Re-slicing Behave with Underlying Arrays in Go Slices?

re-Sicing Slices en Go: Confusión y claridad

GO, los cortes son una forma poderosa y eficiente de representar la serie de datos. Sin embargo, comprender sus complejidades puede ser un desafío para los principiantes. Uno de esos aspectos es el concepto de rehacer las cortes.

Considere el siguiente código:

package main

import "fmt"

func main() {
    a := make([]int, 5)
    printSlice("a", a)
    b := make([]int, 0, 5)
    printSlice("b", b)
    c := b[:2]
    printSlice("c", c)
    d := c[2:5]
    printSlice("d", d)
}

func printSlice(s string, x []int) {
    fmt.Printf("%s len=%d cap=%d %v\n",
        s, len(x), cap(x), x)
}

El programa crea cuatro rebanadas: a, b, c y d. El sorprendente resultado es que Slice C, creado como una porción de los dos primeros elementos de B, tiene una capacidad de 5 en lugar de 2.

para comprender este comportamiento, necesitamos profundizar en el concepto de matrices subyacentes . En Go, las cortes no almacenan los datos reales; Más bien, hacen referencia a una matriz subyacente. Cuando se crea una porción, apunta a un segmento de esta matriz subyacente.

en el ejemplo anterior, cuando B se crea con una longitud de 0 pero una capacidad de 5, se reserva 5 ranuras en una matriz subyacente . Cuando se crea Slice C a partir de B, se convierte en una ventana sobre los dos primeros elementos de B. Sin embargo, la matriz subyacente y, por lo tanto, la capacidad de C sigue siendo 5, que incluye las ranuras no utilizadas en b.

Este concepto de rehicing se ilustra aún más modificando el código ligeramente:

func main() {
    b := make([]int, 0, 5)
    c := b[:2]
    d := c[1:5] // this is equivalent to d := b[1:5]
    d[0] = 1
    printSlice("c", c)
    printSlice("d", d)
}
Ú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