"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Por que meu alcance de gama não modifica os elementos da matriz?

Por que meu alcance de gama não modifica os elementos da matriz?

Publicado em 2025-02-04
Navegar:937

Why Does My Go Range Loop Not Modify Array Elements?

retornando endereços em vez de valores para referências de intervalo

Considere a situação em que uma declaração de intervalo retorna uma cópia de um valor em vez do endereço original . Isso pode levar a um comportamento inesperado, como visto no seguinte 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("--")
    }
}

Neste exemplo, a intenção é modificar a propriedade "Campo" de cada elemento na matriz. No entanto, como a instrução RANGE retorna uma cópia do valor, as alterações são feitas em uma cópia local e não afetam a matriz original. Como resultado, a saída mostra todas as propriedades de "campo" como tendo o valor padrão. Em vez disso, você deve iterar através da matriz usando o índice, como mostrado abaixo:

func main () { Var Array [10] MyType para idx, _: = range matriz { Array [idx] .field = "foo" } Para _, e: = Array Range { fmt.println (e.field) fmt.println ("-") } }

func main() {
    var array [10]MyType

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

    for _, e := range array {
        fmt.Println(e.field)
        fmt.Println("--")
    }
}
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3