"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 > Ao incorporar estruturas no Go: ponteiros ou valores incorporados?

Ao incorporar estruturas no Go: ponteiros ou valores incorporados?

Publicado em 15/11/2024
Navegar:916

When Embedding Structs in Go: Pointers or Embedded Values?

Estruturas de incorporação: quando preferir ponteiros

Ao incorporar uma estrutura dentro de outra, há duas opções: usar um ponteiro ou um valor incorporado . Para orientar essa decisão, é importante entender as especificações e considerar as vantagens de cada abordagem.

Ponteiros vs. Valores Embutidos

De acordo com a especificação Go, um O campo anônimo (também conhecido como campo incorporado) pode ser declarado como um nome de tipo ou como um ponteiro para um nome de tipo que não seja de interface. Isso significa que você tem a opção de usar o tipo log.Logger ou um ponteiro *log.Logger para o campo Logger no exemplo a seguir:

type Job struct {
    Command string
    *log.Logger
}

Benefícios dos ponteiros

O artigo "Incorporação no Go" de Eric Urban destaca as vantagens de incorporar um ponteiro, que é conhecido como "incorporar por ponteiro ." Isso inclui:

  • Flexibilidade de inicialização: funções que usam o idioma NewX normalmente retornam uma estrutura por ponteiro, permitindo fácil inicialização.
  • Extensibilidade dinâmica: Incorporar um ponteiro permite alterar a instância incorporada dinamicamente em tempo de execução sem precisar instanciar a estrutura. Isso pode ser útil para cenários como o padrão Flyweight.

Exemplo de incorporação de ponteiro

type Bitmap struct{
    data [4][5]bool
}

type Renderer struct{
    *Bitmap //Embed by pointer
    on uint8
    off uint8
}

Neste exemplo, o tipo Renderer incorpora um Bitmap por ponteiro. Isso significa que várias instâncias do Renderer podem compartilhar uma única instância do Bitmap e personalizar seu comportamento de forma independente.

Limitações técnicas

É importante observar que você não pode usar ponteiros para ponteiros ou ponteiros para interfaces como campos anônimos. Essa restrição decorre do fato de esses tipos não possuírem métodos, o que é um aspecto fundamental da incorporação. Os métodos são promovidos do tipo incorporado para o tipo incorporado, permitindo que você os acesse diretamente.

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