"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 > Como os ponteiros afetam a modificação de valores nas funções Go?

Como os ponteiros afetam a modificação de valores nas funções Go?

Publicado em 2024-11-07
Navegar:345

How do pointers affect value modification in Go functions?

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.

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