Eu sei que os ponteiros em Go permitem a mutação dos argumentos de uma função, mas não teria sido mais simples se eles adotassem apenas referências (com const apropriados ou qualificadores mutáveis). Agora temos ponteiros e, para alguns tipos internos, como mapas e canais, passam por referência implícitos.
Estou perdendo alguma coisa ou as dicas do Go são apenas uma complicação desnecessária?
Respostas:
Eu realmente gosto de exemplos tirados de http://www.golang-book.com/8
em contraste com
fonte
Os ponteiros são úteis por vários motivos. Os ponteiros permitem o controle sobre o layout da memória (afeta a eficiência do cache da CPU). Em Go podemos definir uma estrutura onde todos os membros estão em memória contígua:
Nesse caso, as
Point
estruturas são incorporadas àLineSegment
estrutura. Mas você nem sempre pode incorporar dados diretamente. Se você deseja oferecer suporte a estruturas como árvores binárias ou lista vinculada, você precisa oferecer suporte a algum tipo de ponteiro.Java, Python etc. não tem esse problema porque não permite que você insira tipos compostos, portanto, não há necessidade de diferenciar sintaticamente entre embutir e apontar.
Problemas com estruturas Swift / C # resolvidos com ponteiros Go
Uma alternativa possível para fazer o mesmo é diferenciar entre
struct
eclass
como fazem C # e Swift. Mas isso tem limitações. Embora geralmente você possa especificar que uma função recebe uma estrutura comoinout
parâmetro para evitar a cópia da estrutura, isso não permite que você armazene referências (ponteiros) para estruturas. Isso significa que você nunca pode tratar uma estrutura como um tipo de referência quando achar isso útil, por exemplo, para criar um alocador de pool (veja abaixo).Alocador de memória personalizado
Usando ponteiros, você também pode criar seu próprio alocador de pool (isso é muito simplificado com muitas verificações removidas apenas para mostrar o princípio):
Trocar dois valores
Ponteiros também permitem que você implemente
swap
. Isso é trocar os valores de duas variáveis:Conclusão
Java nunca foi capaz de substituir totalmente C ++ para programação de sistemas em locais como o Google, em parte porque o desempenho não pode ser ajustado para a mesma extensão devido à falta de capacidade de controlar o layout e o uso da memória (falhas de cache afetam o desempenho significativamente). Go tem como objetivo substituir C ++ em muitas áreas e, portanto, precisa oferecer suporte a ponteiros.
fonte
As referências não podem ser reatribuídas, enquanto os ponteiros podem. Isso por si só torna os ponteiros úteis em muitas situações em que as referências não podem ser usadas.
fonte
Go foi projetado para ser uma linguagem concisa e minimalista. Portanto, começou apenas com valores e ponteiros. Posteriormente, por necessidade, alguns tipos de referência (fatias, mapas e canais) foram adicionados.
A linguagem de programação Go: Perguntas frequentes sobre design de linguagem: Por que mapas, fatias e canais são referências enquanto matrizes são valores?
"Há muita história sobre esse assunto. No início, mapas e canais eram ponteiros sintaticamente e era impossível declarar ou usar uma instância sem ponteiro. Além disso, lutamos para saber como os arrays deveriam funcionar. Eventualmente, decidimos que a separação estrita de ponteiros e valores tornou a linguagem mais difícil de usar. A introdução de tipos de referência, incluindo fatias para lidar com a forma de referência dos arrays, resolveu esses problemas. Os tipos de referência adicionam alguma complexidade lamentável à linguagem, mas têm um grande efeito na usabilidade: Go tornou-se um linguagem mais produtiva e confortável quando foram apresentados. "
A compilação rápida é um dos principais objetivos do design da linguagem de programação Go; isso tem seus custos. Uma das baixas parece ser a capacidade de marcar variáveis (exceto para constantes de tempo de compilação básicas) e parâmetros como imutáveis. Foi solicitado, mas recusado.
nozes de golang: vá a linguagem. Algum feedback e dúvidas.
"Adicionar const ao sistema de tipo força-o a aparecer em todos os lugares e força a removê-lo de todos os lugares se algo mudar. Embora possa haver algum benefício em marcar objetos imutáveis de alguma forma, não achamos que um qualificador de tipo const seja adequado ir."
fonte