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.
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