Saltar al contenido

Uso de punteros en un bucle for

Agradecemos tu apoyo para difundir nuestras secciones sobre las ciencias de la computación.

Solución:

Esto se debe a que solo hay una única variable de bucle. chart, y en cada iteración solo se le asigna un nuevo valor. Entonces, si intenta tomar la dirección de la variable de bucle, será la misma en cada iteración, por lo que almacenará el mismo puntero y el objeto señalado (la variable de bucle) se sobrescribirá en cada iteración (y después del bucle). mantendrá el valor asignado en la última iteración).

Esto se menciona en Spec: Para sentencias: Para sentencias con range cláusula:

Las variables de iteración pueden ser declaradas por la cláusula “rango” usando una forma de declaración de variable corta (:=). En este caso, sus tipos se establecen en los tipos de los respectivos valores de iteración y su alcance es el bloque de la instrucción “for”; se reutilizan en cada iteración. Si las variables de iteración se declaran fuera de la instrucción “for”, después de la ejecución sus valores serán los de la última iteración.

Su segunda versión funciona, porque pasa la variable de bucle a una función, por lo que se hará una copia y luego almacena la dirección de la copia (que está separada de la variable de bucle).

Sin embargo, puede lograr el mismo efecto sin una función: simplemente cree una copia local y use la dirección de eso:

for _, chart := range arr 
    chart2 := chart
    err := svc.repo.Store(&chart2) // Address of the local var
    // ... error handling

También tenga en cuenta que también puede almacenar la dirección de los elementos de segmento:

for i := range arr 
    err := svc.repo.Store(&arr[i]) // Address of the slice element
    // ... error handling

La desventaja de esto es que, dado que almacena punteros a los elementos de corte, todo el respaldo array de la porción tendría que mantenerse en la memoria mientras mantenga cualquiera de los punteros (el array no se puede recolectar basura). Además, los punteros que almacene compartirían el mismo Chart valores como el sector, por lo que si alguien modificara un valor de gráfico del sector pasado, eso afectaría los gráficos cuyos punteros almacenó.

Ver preguntas relacionadas:

Golang: Registre múltiples rutas usando el rango para segmentos/mapa de bucle

¿Por qué estas dos variaciones de bucle for me dan un comportamiento diferente?

Nos encantaría que puedieras difundir esta sección si si solucionó tu problema.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *