Quão popular é a língua Go? Países estrangeiros como Google, AWS, Cloudflare, CoreOS, etc., e empresas nacionais como Qiniu e Alibaba começaram a usar a linguagem Go para desenvolver seus produtos relacionados à computação em nuvem em larga escala. Quais Sims e Mas devo prestar atenção ao usar a linguagem Go? Recentemente, escrevemos uma API usando a linguagem Go, uma linguagem de programação open-source lançada pelo Google em 2009. No processo de usar o Go para desenvolvimento, adquirimos muita experiência e experiência, e queremos compartilhar isso com os leitores, por isso temos este artigo.
Ao escolher uma linguagem de programação para um projeto, sempre recomendamos entender no que o projeto irá construir antes de considerar em qual linguagem de programação desenvolver. Deixe o produto ser o fator decisivo em como ele deve ser construído.
Aqui estão alguns dos prós e contras que encontramos ao desenvolver com o Go para ajudar você a entender se ele é adequado para seu próximo projeto.
O que amamos no Go
O uso da língua Go explodiu nos últimos anos. Parece que toda startup usa para sistemas backend. Existem muitos motivos para os desenvolvedores considerarem isso tão popular.
A linguagem Go é muito rápida
Go é uma linguagem de programação muito rápida. Como o Go é compilado em código de máquina, ele naturalmente supera linguagens de programação que são interpretativas ou possuem um tempo de execução virtual. Programas Go também compilam muito rápido e produzem binários muito pequenos. Nossa API compila em apenas alguns segundos, resultando em um arquivo executável de apenas 11,5MB.
Fácil de dominar
A sintaxe da linguagem Go é simples e fácil de entender em comparação com outras linguagens diferentes. Você consegue memorizar a maior parte da sintaxe do Go na sua cabeça, o que significa que não precisa gastar muito tempo procurando coisas. A linguagem do Go também é muito limpa e fácil de ler. Programadores que não são Go, especialmente aqueles acostumados com sintaxe estilo C, conseguem ler o código do programa Go e entender o que está acontecendo.
Linguagem de definição de tipos estática
Go é uma linguagem poderosa e estática que define tipos. Existem tipos básicos como int, byte e string. Também existem tipos de estruturas. Como em qualquer linguagem fortemente tipada, o sistema de tipos permite que o compilador ajude a detectar erros para toda a classe. A linguagem Go também tem listas e tipos de mapeamento embutidos, e eles também são fáceis de usar.
Tipo de interface
A linguagem Go possui tipos de interface, e qualquer estrutura pode simplesmente satisfazer uma interface ao implementar a interface. Isso permite que você desacople dependências no seu código. Você pode então simular suas dependências nos testes. Usando interfaces, você pode escrever código mais modular e testável. A linguagem Go também possui funções de primeira classe, o que possibilita aos desenvolvedores escrever código de forma mais prática.
Biblioteca padrão
A linguagem Go tem uma biblioteca padrão bem boa. Ele oferece funções embutidas convenientes para lidar com tipos básicos. Alguns pacotes facilitam a construção de um servidor web, o gerenciamento de I/O, o uso de criptografia e a manipulação de bytes brutos. A serialização e desserialização JSON fornecida pela biblioteca padrão é muito simples. Usando "tags", você pode especificar o nome do campo JSON ao lado do campo struct.
Suporte a testes
O suporte a testes está embutido na biblioteca padrão e não requer dependências adicionais. Se você tem um arquivo chamado thing.go, escreva testes em outro arquivo chamado thing_test.go e execute o "go test". Go fará esses testes rapidamente.
Ferramentas de análise estática
As ferramentas de análise estática para a linguagem Go são numerosas e poderosas. Uma ferramenta em particular é o gofmt, que formata o código de acordo com o estilo sugerido pelo Go. Isso pode normalizar muitas das opiniões do projeto, permitindo que o gerente de premiação da equipe foque no trabalho realizado pelo código. Rodamos gofmt, golint e vet em cada build, e se encontrarmos algum aviso, a build falha.
Coleta de lixo
Ao projetar a linguagem Go, o gerenciamento de memória foi intencionalmente projetado para ser mais fácil do que C e C++. O objeto da alocação dinâmica é a coleta de lixo. A linguagem Go torna o uso de ponteiros mais seguro porque não permite operações com ponteiro. Também é oferecida a opção de usar tipos de valor.
Modelo de concorrência mais fácil
Embora programação simultânea nunca seja fácil, o Go é mais fácil de programar simultaneamente do que outras linguagens. Criar um thread leve chamado "goroutine" e se comunicar com ele via "channel" é quase uma tarefa simples, mas é possível para modelos mais complexos.
O que não gostamos no Go
Como discutimos antes, Go é realmente uma excelente língua. Tem uma sintaxe limpa e é rápido de executar. Também tem muitas vantagens. Mas toda uma linguagem de programação não se refere apenas à sua sintaxe. Aqui estão alguns dos problemas que encontramos.
Não existem genéricos
Primeiro, esse problema, como um elefante na sala, é um fato óbvio e negligenciado. Não existem genéricos na linguagem Go. Para desenvolvedores de linguagens como Java, migrar para o Go é um grande obstáculo a ser superado. Isso significa que o nível de reutilização do código é reduzido. Embora a linguagem Go tenha funções de primeira classe, se você escrever funções como "map", "reduce" e "filter", que são projetadas para operar em um tipo de coleção, não pode reutilizar essas funções para outros tipos diferentes de coleções. Existem muitas maneiras de resolver esse problema, mas todas acabam escrevendo mais código, o que reduz produtividade e manutenção.
A interface é implícita
Embora seja bom ter interfaces, a estrutura implementa interfaces implicitamente, não explicitamente. Diz-se que essa é uma das forças da linguagem Go, mas achamos difícil dizer, pela estrutura, se ela implementava interfaces ou não. Você só consegue realmente entender tentando compilar o programa. Se o programa for pequeno, certamente não há problema nisso. Mas se esse programa for de médio a grande porte, o problema é grande.
Apoio pobre à biblioteca
O suporte à biblioteca do Go é desigual. Nossa API se integra ao Contentful, mas este último não possui um SDK Go oficialmente suportado. Isso significa que temos que escrever (e manter!) Muito código para solicitar e analisar dados no Contentful. Também precisamos depender de bibliotecas Elasticsearch de terceiros. SDKs do Go fornecidos por fornecedores não são tão populares quanto seus equivalentes em Java, Ruby ou JavaScript.
A comunicação comunitária é difícil
A comunidade Go pode não aceitar sugestões. Considere isso no repositório GitHub do golint:O login do hiperlink está visível., um usuário solicitou que o Golint pudesse falhar na compilação ao encontrar um aviso (que é o que fazemos no projeto). Os defensores imediatamente descartaram a ideia. No entanto, como muitas pessoas comentaram sobre o problema, após um ano, os mantenedores finalmente tiveram que adicionar os recursos solicitados.
A comunidade do Go também não parece gostar de frameworks web. Embora a biblioteca HTTP da linguagem Go cubra muitos aspectos, ela não suporta parâmetros de caminho, verificação de entrada e validação, nem suporta preocupações transversais comuns em aplicações web. Desenvolvedores Ruby têm Rails, desenvolvedores Java têm Spring MVC, e desenvolvedores Python têm Django. Mas muitos desenvolvedores de Go optam por evitar usar frameworks. No entanto, a realidade é que não existem frameworks, pelo contrário, existem muitos. Mas, uma vez que você começa a usar um framework para um projeto, é quase impossível evitar o destino do abandono.
Gerenciamento de dependências fragmentadas
Por muito tempo, a linguagem Go não teve um gerenciador de pacotes estável e formal. Após anos de pedidos da comunidade, o projeto Go lançou o godep recentemente. Antes disso, já havia muitas ferramentas para preencher essa lacuna. Usamos um govendor muito poderoso em nosso projeto, mas isso significa que a comunidade está dividida, o que pode ser muito confuso para desenvolvedores que são novos na linguagem Go. Além disso, quase todos os gerenciadores de pacotes são alimentados por repositórios Git, e o histórico dos repositórios Git pode mudar a qualquer momento. Compare com o Maven Central, que nunca exclui nem altera as bibliotecas das quais seu projeto depende.
Decida se usa o Go ou não
Às vezes, você precisa pensar na máquina. Quando você envia e recebe bytes. Quando você gerencia milhares de processos simultâneos. Você também pode estar escrevendo um sistema operacional, sistema de contêineres ou nó blockchain. Nesses casos, provavelmente você não vai se importar com genéricos. Porque você está ocupado extraindo desempenho por nanosegundo do chip.
No entanto, muitas vezes, é preciso pensar nos humanos. Dados da área de negócio com os quais você precisa trabalhar: clientes, funcionários, produtos, pedidos. Você precisa escrever a lógica de negócio que opera nessas entidades de domínio, e precisa manter essa lógica de negócios por muitos anos. E precisa lidar com necessidades em mudança, e quanto mais rápido, melhor. Nesses casos, a experiência do desenvolvedor é importante.
Go é uma linguagem de programação que valoriza o tempo de máquina mais do que o tempo humano. Às vezes, na sua área, o desempenho de máquinas ou programas é o mais crítico. Nesses casos, o Go pode ser uma boa alternativa a C ou C++. Mas quando você escreve uma aplicação típica de n-níveis, frequentemente surgem gargalos de desempenho no banco de dados e, mais importante, em como você vai modelar os dados.
Ao decidir se deve usar a linguagem Go, considere as seguintes regras básicas:
- Se você está lidando com bytes, então a linguagem Go pode ser uma boa escolha.
- Se você está lidando com dados, então a linguagem Go pode não ser uma boa escolha.
Isso pode mudar um dia no futuro. A língua e a comunidade do Go ainda são jovens. Eles podem nos surpreender com a adição de genéricos; Ou um framework web popular vai ganhar muito. No entanto, por enquanto, vamos manter linguagens de programação maduras com suporte universal, gestão de dependências avançada e foco em modelagem de domínios de negócios.
|