Compreendendo a modificação de valor com ponteiros no Go
No Go, os ponteiros permitem acesso indireto e modificação de valores. No entanto, entender como os ponteiros funcionam é crucial ao passá-los para funções.
Ao passar um ponteiro para uma função, surgem dois cenários: modificação de valor vs. reatribuição de ponteiro.
Cenário 1 : Modificação de valor
Considere este código:
type Test struct { Value int }
func main() {
var i Test = Test {2}
var p *Test = &i
f(p)
println(i.Value) // 4
}
func f(p *Test) {
*p = Test{4}
}
Aqui, a função f recebe um ponteiro para a estrutura Test. Dentro de f, o ponteiro desreferenciado (*p) recebe uma nova estrutura de teste com um valor de 4. Isso efetivamente modifica a estrutura i original na função principal e a saída é 4.
Cenário 2: Reatribuição do ponteiro
Agora, vamos alterar um pouco o código:
type Test struct { Value int }
func main() {
var i Test = Test {2}
var p *Test = &i
f(p)
println(i.Value) // 2
}
func f(p *Test) {
// ?
p = &Test{4}
}
Nesse caso, em vez de modificar o valor apontado, a função reatribui o ponteiro p para uma nova estrutura de Teste com um valor de 4. Como p é uma variável local dentro de f, essa mudança não afeta o original eu struct na função principal, e a saída permanece 2.
Solução: Modificando o valor apontado
Para modificar o valor apontado, devemos desreferenciar o ponteiro e acessar diretamente o membro da estrutura:
type Test struct { Value int }
func main() {
var i Test = Test {2}
var p *Test = &i
f(p)
println(i.Value) // 4
}
func f(p *Test) {
p.Value = 4
}
Ao usar p.Value, modificamos o campo Value da estrutura original, resultando em uma saída de 4.
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