"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é la reproducción aleatoria de un sector afecta a un sector asignado a ella en Go?

¿Por qué la reproducción aleatoria de un sector afecta a un sector asignado a ella en Go?

Publicado el 2024-11-11
Navegar:702

Why does shuffling a slice affect a slice assigned to it in Go?

Manejo de matrices en Go

En Go, las matrices son tipos de valores y la asignación de una matriz a otra crea una copia de todos sus elementos. Esto es válido incluso cuando se pasa una matriz a una función, ya que recibirá una copia en lugar de una referencia de memoria.

Pregunta original

Se planteó una consulta con respecto a siguiente código:

package main

import (
    "fmt"
    "rand"
    "time"
)

func shuffle(arr []int) {
    rand.Seed(time.Nanoseconds())
    for i := len(arr) - 1; i > 0; i-- {
        j := rand.Intn(i)
        arr[i], arr[j] = arr[j], arr[i]
    }
}

func main() {
    arr := []int{1, 2, 3, 4, 5}
    arr2 := arr
    shuffle(arr)
    for _, i := range arr2 {
        fmt.Printf("%d ", i)
    }
}

El autor expresó confusión sobre por qué arr2 se vio afectado por la función aleatoria, a pesar de que esperaba que arr2 y arr fueran entidades distintas.

Aclaración

El problema surge de un malentendido entre matrices y sectores.

Arrays vs Los sectores

Las matrices son colecciones de valores de longitud fija, mientras que los sectores son referencias dinámicas a los conjuntos subyacentes. En el ejemplo de código proporcionado, no se utilizan matrices.

Manipulación de sectores

La línea arr := []int{1, 2, 3, 4, 5} crea un segmento que hace referencia a una matriz subyacente anónima. La siguiente línea arr2 := arr simplemente duplica esta referencia, lo que da como resultado que arr y arr2 apunten a la misma matriz subyacente.

Comportamiento de la función

Al pasar arr al función aleatoria, se crea una copia del segmento, no la matriz subyacente. Esta copia es modificada por la función, razón por la cual arr2 también se ve afectado cuando se modifica arr.

Conclusión

En Go, los sectores se comportan como referencias a matrices subyacentes. Asignar un segmento a otro copia la referencia, no la matriz subyacente. Este concepto es crucial para comprender la manipulación de cortes en Go.

Ú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