Aprenda sobre os pontos fortes, fraquezas, casos de utilização e desenvolvimentos futuros da linguagem de programação de sucesso do Google.

Por Serdar Yegulalp
Ao longo da sua mais de uma década de vida, a linguagem Go do Google, também conhecida como Golang (versão 1.18 a partir de março de 2022), cresceu de uma curiosidade nerd para a linguagem de programação testada em batalha por alguns dos projetos mais importantes do mundo centrados nas clouds.
Porque é que os criadores de projetos como Docker e Kubernetes escolheram a Go, quais são as características definidoras da Go, como difere de outras linguagens de programação, e para que tipos de projetos é mais adequada? Neste artigo, vamos explorar o conjunto de características da Go, casos de utilização ótima, as omissões e limitações da língua, e para onde poderá ir no futuro.
A linguagem Go é pequena e simples
A Go, ou Golang como é frequentemente chamada, foi desenvolvida por funcionários da Google (principalmente o veterano guru Unix e distinto engenheiro da Google Rob Pike), mas não é estritamente um “projeto Google”. Em vez disso, a Go está a ser desenvolvida como um projeto de código-fonte aberto dirigido pela comunidade, liderado por uma liderança que tem opiniões fortes sobre como esta linguagem deve ser usada e a direção que deve tomar.
A Go destina-se a ser fácil de aprender, fácil de trabalhar e fácil de ler por outros criadores. Não tem um grande conjunto de características, especialmente quando comparado com linguagens como C++. Faz lembrar o C na sua sintaxe, por isso, é relativamente fácil de aprender para os criadores de C ao longo da vida. Dito isto, muitas características da Go, especialmente as suas características de simultaneidade e programação funcional, fazem lembrar linguagens como Erlang.
Como linguagem tipo C para construir e manter aplicações empresariais de todos os tipos, a Go tem muito em comum com Java. E como meio de permitir o rápido desenvolvimento de código que pode correr em qualquer lugar, pode-se traçar-se um paralelo entre Go e Python, embora as diferenças sejam muito maiores do que as semelhanças.
A linguagem Go tem algo para todos
A documentação Go descreve-a como “uma linguagem rápida, estaticamente codificada e compilada que se comporta como uma linguagem interpretada, dinamicamente codificada”. Mesmo um grande programa Go compila em questão de segundos. Além disso, a Go evita grande parte das despesas gerais de arquivos de inclusão e bibliotecas ao estilo C.
A Go facilita a vida do desenvolvedor de várias maneiras
– É conveniente
A Go tem sido comparada a linguagens de scripting, como a Python, na sua capacidade de satisfazer muitas necessidades de programação comuns. Algumas destas funcionalidades estão incorporadas na própria linguagem, tais como goroutinos para comportamento concomitante e semelhante a um fio, enquanto capacidades adicionais estão disponíveis nos pacotes de biblioteca padrão da Go, tais como o pacote http da Go. Tal como a Python, a Go fornece capacidades de gestão automática de memória, incluindo a recolha de lixo.
Ao contrário das linguagens de scripting como Python, o código Go é compilado num binário nativo de funcionamento rápido. E ao contrário do C ou C++, a Go compila extremamente rápido, suficientemente rápido que trabalhar com Go é mais como trabalhar com uma linguagem de scripting do que com uma linguagem compilada. Além disso, o sistema de compilação da Go é menos complexo do que o de outras línguas compiladas. São necessários poucos passos e pouca contabilidade para construir e executar um projeto Go.
– É rápido
Os binários funcionam mais lentamente do que os seus equivalentes em C, mas a diferença de velocidade é insignificante para a maioria das aplicações. O desempenho da Go é tão bom como a C para a grande maioria dos trabalhos, e geralmente muito mais rápida do que outras linguagens conhecidas pela sua velocidade de desenvolvimento (por exemplo, JavaScript, Python e Ruby).
– É portátil
Os executáveis criados com a cadeia de ferramentas Go podem ser autónomos, sem dependências externas por defeito. A cadeia de ferramentas Go está disponível para uma grande variedade de sistemas operativos e plataformas de hardware, e pode ser utilizada para compilar binários em diferentes plataformas.
– É interoperável
A Go oferece tudo o que foi dito acima sem sacrificar o acesso ao sistema subjacente. Os programas Go podem falar com bibliotecas C externas ou fazer chamadas de sistema nativo. No Docker, por exemplo, a Go interage com funções Linux de baixo nível, cgroups e namespaces, para fazer magia de contentores.
– É amplamente apoiada
A cadeia de ferramentas Go está disponível gratuitamente como um binário Linux, MacOS ou Windows ou como um contentor Docker. A Go está incluída por defeito em muitas distribuições populares de Linux, tais como Red Hat Enterprise Linux e Fedora, tornando fácil a implementação do código fonte Go nessas plataformas. O apoio para Go é também forte em muitos ambientes de desenvolvimento de terceiros, desde o Microsoft Visual Studio Code ao ActiveState’s Komodo IDE.
Onde a linguagem Go funciona melhor
Nenhuma linguagem é adequada para cada trabalho, mas algumas são mais adequadas do que outras. A Go brilha melhor para desenvolver os seguintes tipos de aplicações.
– Desenvolvimento nativo na cloud
As características de concorrência e de rede da Go, bem como o seu elevado grau de portabilidade, tornam-na bem adequada para a construção de aplicações nativas da cloud. De facto, a Go foi utilizada para criar várias pedras angulares da computação nativa da cloud, tais como Docker, Kubernetes e Istio.
– Serviços de rede distribuídos
As aplicações de rede vivem e morrem por concorrência, e as características nativas de concorrência da Go (motores e condutas, principalmente) são bem adequadas para este tipo de trabalho. Consequentemente, muitos projetos Go são para redes, funções distribuídas e serviços em cloud: APIs, servidora web, frameworks mínimos para aplicações web, e afins.
– Utilitários e ferramentas autónomas
Programas Go compilados em binários com dependências externas mínimas. Isto torna-os ideais para a criação de utilitários e outras ferramentas, porque são lançados rapidamente e podem ser facilmente embalados para redistribuição. Um exemplo é um servidor de acesso chamado Teleport (para SSH, entre outras coisas). O teletransporte pode ser implementado para servidores rápida e facilmente, compilando-o a partir do código fonte ou descarregando um binário pré-compilado.
Limitações da linguagem Go
O conjunto de características da Go tem atraído tanto elogios como críticas. A Go foi concebida para ser fácil de compreender, omitindo deliberadamente algumas características. O resultado é que algumas características que são comuns noutras línguas não estão deliberadamente disponíveis em Go.
Uma das queixas mais antigas era a falta de funções genéricas, que permitem que uma função aceite muitos tipos diferentes de variáveis. Durante muitos anos, a equipa de desenvolvimento Go resistiu a acrescentar funções genéricas à linguagem, argumentando que queriam uma sintaxe e um conjunto de comportamentos que complementassem o resto da Go. Mas a partir da Go 1.18, lançada no início de 2022, a linguagem inclui agora uma sintaxe para os genéricos. A lição a aprender é que a Go acrescenta características importantes raramente e apenas após muita consideração, para preservar uma ampla compatibilidade entre versões.
Outra desvantagem potencial da Go é o tamanho dos binários gerados. Os binários Go são compilados estatisticamente por defeito, o que significa que tudo o que é necessário em tempo de execução está incluído na imagem binária. Esta abordagem simplifica o processo de construção e implementação, mas à custa de um simples “Olá, mundo!” que pesa cerca de 1,5 MB em Windows de 64 bits. A equipa Go tem estado a trabalhar para reduzir o tamanho destes binários com cada lançamento sucessivo. Também é possível reduzir os binários Go através da compressão ou remoção da informação de Go debugging. Esta última opção pode funcionar melhor para aplicações distribuídas isoladas do que para serviços em nuvem ou em rede, onde ter informação de debug é útil se um serviço falhar no local.
Outra característica da Go, a gestão automática da memória, pode ser vista como uma desvantagem, uma vez que a recolha de lixo requer uma certa quantidade de despesas de processamento. Por conceção, a Go não fornece gestão manual de memória, e a recolha de lixo em Go tem sido criticada por não lidar bem com os tipos de cargas de memória que aparecem nas aplicações empresariais.
Dito isto, cada nova versão da Go parece melhorar as funcionalidades de gestão de memória. Por exemplo, a Go 1.8 trouxe tempos de atraso significativamente mais curtos para a recolha do lixo. Os programadores Go têm a possibilidade de utilizar a alocação manual de memória numa extensão C, ou através de uma biblioteca de gestão manual de memória de terceiros, mas a maioria dos programadores Go prefere soluções nativas a tais problemas.
A cultura de software em torno da construção de interfaces gráficas de utilizador ricas para aplicações Go, como as das aplicações desktop, ainda se encontra dispersa.
A maioria das aplicações Go são ferramentas de linha de comando ou serviços de rede. Dito isto, vários projetos estão a trabalhar para fornecer GUIs ricas para aplicações Go. Existem ligações para as estruturas GTK e GTK3. Outro projeto visa fornecer interfaces de utilizador nativas da plataforma, embora estas se baseiem em ligações C e não estejam escritas em Go puro. E os utilizadores do Windows podem tentar Go. Mas nenhum vencedor claro ou aposta segura a longo prazo surgiu neste espaço, e alguns projetos, como a tentativa do Google de criar uma biblioteca GUI multiplataforma, caíram no esquecimento. Além disso, uma vez que Go é independente da plataforma por conceção, é improvável que qualquer um deles se torne parte do conjunto padrão de pacotes.
Embora a Go possa falar com funções de sistema nativas, não foi concebida para criar componentes de sistema de baixo nível, tais como kernels ou controladores de dispositivos, ou sistemas incorporados. Afinal, o tempo de execução Go e o coletor de lixo das aplicações Go dependem do sistema operativo subjacente. (Os programadores interessados numa linguagem de ponta para esse tipo de trabalho podem olhar para a linguagem Rust).
O futuro da linguagem Go
O desenvolvimento futuro da Go está a tornar-se mais orientado para os desejos e necessidades da sua base de desenvolvedores, e os desenvolvedores Go estão a mudar a linguagem para melhor acomodar este público, em vez de liderar pelo exemplo. Um exemplo disto são os genéricos, que foram finalmente acrescentados à língua após muita deliberação sobre a melhor forma de o fazer.
O Inquérito Go Developer de 2021 revelou que os utilizadores Go estavam geralmente satisfeitos com o que a língua oferece, mas também citou muito espaço para melhorias. As principais áreas onde os utilizadores de Go pretendiam melhorias eram a gestão de dependência (um desafio constante em Go), diagnóstico de erros e fiabilidade, enquanto questões como memória, utilização de CPU, tamanho binário e tempos de compilação se classificavam muito abaixo.
A maioria das linguagens gravita para um conjunto básico de casos de utilização. Na década que se seguiu à Go, o seu nicho tornou-se serviços de rede, onde é provável que continue a expandir o seu domínio. Globalmente, o principal caso de utilização citado para a língua foi a construção de APIs ou serviços RPC (49%), seguido pelo processamento de dados (10%), serviços web (10%) e aplicações CLI (8%).
Outro sinal da crescente atratividade da língua Go é o número de criadores que a escolhem depois de a avaliarem. Setenta e cinco por cento dos inquiridos que consideraram utilizar Go para um projeto escolheram a línguagem. Dos que não escolheram Go, Rust (25%), Python (17%) e Java (12%) foram as principais escolhas. Cada uma destas linguagens encontrou, ou está a encontrar, outros nichos: Rust para programação segura e rápida de sistemas; Python para prototipagem, automação e código de cola; e Java para aplicações empresariais de longa duração.
Resta saber até que ponto a velocidade e a simplicidade de desenvolvimento da Go a transportará para outros casos de utilização, ou até que ponto a Go penetrará no desenvolvimento empresarial. Mas o futuro da Go como uma grande linguagem de programação já está assegurado, certamente na cloud, onde a velocidade e simplicidade da Go facilitam o desenvolvimento de uma infraestrutura escalável que pode ser sustentada a longo prazo.