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().
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