"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 a modificação do ponteiro nas funções Go às vezes não afeta o valor original?

Por que a modificação do ponteiro nas funções Go às vezes não afeta o valor original?

Publicado em 2024-11-07
Navegar:169

 Why Does Pointer Modification in Go Functions Sometimes Not Affect the Original Value?

Modificação de ponteiro em Go, entendendo as diferenças

Em Go, ao passar um ponteiro para uma função, geralmente pretendemos modificar o valor apontado por esse ponteiro. Normalmente, isso pode ser conseguido por meio de desreferenciação, conforme ilustrado no código a seguir:

type Test struct {
    Value int
}

func main() {
    i := Test{2}
    p := &i
    f(p)
    println(i.Value) // Output: 4
}

func f(p *Test) {
    *p = Test{4}
}

No entanto, pode haver casos em que o valor da estrutura apontada pelo ponteiro passado permanece inalterado, mesmo após sua modificação dentro da função. Para entender por que isso ocorre, vamos examinar um trecho de código modificado:

type Test struct {
    Value int
}

func main() {
    i := Test{2}
    p := &i
    f(p)
    println(i.Value) // Output: 2
}

func f(p *Test) {
    // Attempt to modify the pointer value
    p = &Test{4}
}

Este trecho de código tenta modificar o valor do ponteiro p, mas não consegue alterar o valor da estrutura originalmente apontada. A razão para isso é que a atribuição p = &Test{4} dentro da função f() apenas modifica o valor da variável local p.

Dentro da função f(), p é tratado como uma variável local , e atribuir um novo valor a ele não afeta o valor do ponteiro passado da função main(). Consequentemente, a estrutura apontada por p permanece inalterada, refletida no valor inalterado de i.Value quando impresso.

Em contraste, o código a seguir demonstra a abordagem correta para modificar o valor da estrutura:

type Test struct {
    Value int
}

func main() {
    i := Test{2}
    p := &i
    f(p)
    println(i.Value) // Output: 4
}

func f(p *Test) {
    p.Value = 4
}

Neste código, p.Value = 4 modifica diretamente o campo Value da estrutura apontada por p. Isso resulta na modificação desejada do valor da estrutura, que é refletido no valor atualizado de i.Value quando impresso.

Vale a pena notar que atribuir um novo valor ao próprio ponteiro (como em p = &Test{ 4}) tem um efeito diferente. Esta atribuição criaria um novo ponteiro apontando para uma nova estrutura, mas não afetaria o valor da estrutura apontada pelo ponteiro original passado da função main().

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