"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 > Estruturas incorporadas no Go: quando incorporar por valor versus por ponteiro?

Estruturas incorporadas no Go: quando incorporar por valor versus por ponteiro?

Publicado em 2024-11-04
Navegar:696

Embedded Structs in Go: When to Embed by Value vs. by Pointer?

Estruturas incorporadas em Go: ponteiro vs. objeto

Ao lidar com receptores de ponteiro e construir tipos de ponteiro, entendendo a diferença entre incorporar uma estrutura como um objeto (B) versus um ponteiro (*B) torna-se crucial. Nesse contexto, os valores zero desses dois tipos de estrutura incorporada diferem significativamente.

Incorporação direta (objeto)

Se uma estrutura B com receptores de ponteiro for incorporada diretamente como um objeto dentro de uma estrutura A, seu valor zero inclui um objeto incorporado do tipo B, que por sua vez possui um valor zero. Os desenvolvedores podem acessar com segurança esse objeto incorporado e seus métodos.

type B struct {
    X int
}

func (b *B) Print() { fmt.Printf("%d\n", b.X) }

type AObj struct {
    B
}

var aObj AObj
aObj.Print() // prints 0

Incorporação de ponteiro

Em contraste, incorporar um ponteiro em B (*B) cria um cenário diferente. O valor zero desta estrutura incorporada tem um valor de ponteiro nulo, tornando-a diretamente inutilizável.

type APtr struct {
    *B
}

var aPtr APtr
aPtr.Print() // panics

Cópia de objeto

Quando um objeto AObj é criado, ele obtém uma cópia do objeto B incorporado. As modificações feitas na cópia não afetam o objeto original.

aObj2 := aObj
aObj.X = 1
aObj2.Print() // prints 0

Cópia de ponteiro

Com APtr, a criação de um novo objeto copia o ponteiro (*B), mas não o objeto concreto subjacente apontado para. Portanto, as modificações no novo objeto afetam tanto o objeto original quanto o novo.

aPtr.B = &B{}
aPtr2 := aPtr
aPtr.X = 1
aPtr2.Print() // prints 1

É importante considerar o caso de uso e os requisitos específicos ao determinar se uma estrutura deve ser incorporada como um objeto ou um ponteiro. Esta decisão pode impactar a inicialização zero, o comportamento de cópia e a propriedade do objeto, entre outros fatores.

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