"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é se produce una sobrescritura de variables en Go cuando se agregan sectores de la misma matriz?

¿Por qué se produce una sobrescritura de variables en Go cuando se agregan sectores de la misma matriz?

Publicado el 2024-11-10
Navegar:632

Why Does Variable Overwrite Occur in Go When Appending to Slices from the Same Array?

Causa de la sobrescritura de variables en Go

Su código encuentra un problema de sobrescritura de variables porque está creando nuevos sectores (rutaA y rutaB) agregando elementos a la misma matriz de respaldo (ruta) dentro de un bucle.

Antecedentes de los sectores en Go:

  • Un sector de Go es una estructura de datos que representa un bloque contiguo de elementos del mismo tipo.
  • Los sectores tienen una longitud (el número de elementos almacenados actualmente) y una capacidad (el número máximo de elementos que puede contener).
  • Cuando modifica un sector, puede activar la asignación de una nueva matriz de respaldo si se excede la capacidad.

Problema con su código:

En su código, está creando dos nuevos sectores, rutaA y rutaB, usando la función agregar:

pathA := append(route, nextA)
pathB := append(route, nextB)

Esto es lo que sucede:

  1. Inicialmente, la ruta tiene una capacidad que puede caber tanto en nextA como en nextB. Por lo tanto, se crean dos nuevos segmentos (rutaA y rutaB) con la misma matriz de respaldo que la ruta.
  2. A medida que avanza el bucle y continúa agregando la ruta, su capacidad eventualmente excede su longitud.
  3. En la siguiente iteración del bucle, se asigna una nueva matriz de respaldo para la ruta. Sin embargo, la rutaA y la rutaB aún se refieren a la matriz de respaldo anterior.
  4. Cuando agrega nextB a la ruta, se escribe en el último elemento de la matriz de respaldo anterior, que es compartida tanto por la rutaA como por la rutaB.
  5. Como resultado, tanto la rutaA como la rutaB terminan con el mismo valor final.

Solución:

Para evitar esta sobrescritura, debes asegúrese de que la rutaA y la rutaB tengan matrices de respaldo únicas. Puedes lograr esto creando manualmente un nuevo segmento para uno de ellos usando make y copy:

newRoute := make([]int, len(route), (cap(route) 1)*2)
copy(newRoute, route)
if i % 2 == 0 {
    pathA := append(newRoute, nextA)
} else {
    pathB := append(newRoute, nextB)
}
Declaración de liberación Este artículo se reimprime en: 1729727920 Si hay alguna infracción, comuníquese con [email protected] para eliminarla.
Ú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