"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é mi bucle de gama GO no modifica los elementos de matriz?

¿Por qué mi bucle de gama GO no modifica los elementos de matriz?

Publicado el 2025-02-04
Navegar:975

Why Does My Go Range Loop Not Modify Array Elements?

de devolución de direcciones en lugar de valores para las referencias de rango

Considere la situación en la que una declaración de rango devuelve una copia de un valor en lugar de la dirección original . Esto puede conducir a un comportamiento inesperado, como se ve en el siguiente código GO:

import "fmt"

type MyType struct {
    field string
}

func main() {
    var array [10]MyType

    for _, e := range array {
        e.field = "foo"
    }

    for _, e := range array {
        fmt.Println(e.field)
        fmt.Println("--")
    }
}

En este ejemplo, la intención es modificar la propiedad "campo" de cada elemento en la matriz. Sin embargo, dado que la declaración de rango devuelve una copia del valor, los cambios se realizan a una copia local y no afectan la matriz original. Como resultado, la salida muestra que todas las propiedades de "campo" tienen el valor predeterminado.

para abordar este problema, no puede devolver la dirección del elemento en un bucle de rango. En su lugar, debe iterar a través de la matriz usando el índice, como se muestra a continuación:

func main() {
    var array [10]MyType

    for idx, _ := range array {
        array[idx].field = "foo"
    }

    for _, e := range array {
        fmt.Println(e.field)
        fmt.Println("--")
    }
}

usando el índice en lugar del valor en el bucle for, se asegura de que los cambios realizados en la propiedad "campo" se reflejen en la matriz original.

Ú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