Go: primeiros passos

Olá,

esse primeiro post sobre Go é para mostrar a quem não sabe nada sobre a linguagem algumas características e minhas opiniões a respeito dela. Caso discorde de algo e/ou tenha alguma correção a ser feita no texto pode me apontar nos comentários ou no meu e-mail que darei toda atenção desde que faça de forma educada.

Logos de Go

Senta que lá vem a História

Rá-Tim-Bum: Senta que lá vem a História

Do Wikipedia:

Go é uma linguagem de programação criada pela Google e lançada em código livre em novembro de 2009. É uma linguagem compilada e focada em produtividade e programação concorrente, baseada em trabalhos feitos no sistema operacional chamado Inferno. O projeto inicial da linguagem foi feito em setembro de 2007 por Robert Griesemer, Rob Pike e Ken Thompson. Atualmente, há implementações para Windows, Linux, Mac OS X e FreeBSD.

Como muitas empresas que começaram antes da era dos microserviços o Google é também um monorepo com diversos sistemas e seus legados. Para combater essa complexidade espalhada em sistemas escritos em C++ e Java nasceu Go com várias promessas de entrega em facilidades de criação de código, desempenho e distribuição. Um exemplo disso foi compartilhado pelo Brad Fitzpatrick nos links a seguir:

Características da linguagem

Gophers

Tipagem estática

Se você vem de linguagens como C/C++, Java e C# das mais tradicionais, provavelmente, já deve saber do que se trata isso, diferente de quem vem de Javascript, Ruby e Python que são linguagens de tipagem dinâmica. Linguagens de tipagem estática são aquelas que suas variáveis após declaradas ou incializadas com algum valor assumem um contrato com o tipo atribuido a ela e não mudam ao longo do seu escopo, caso tenha uma tentativa de violação disso o mesmo será sinalizado pelo compilador da linguagem.

Não tem uma máquina virtual

Você já deve ter escutado o termo JVM, Java Virtual Machine, e agora deve suspeitar do que se trata. Sim, é a máquina virtual do Java mas não somente ele, algumas outras linguagens conseguem rodar na JVM mas isso não é papo para agora. O fato de Go não ter uma máquina virtual faz com que o ínicio de sua aplicação seja mais rápido pois não tem a inicialização da máquina virtual, você vai escutar por ai: “Go tem footprint baixo”, e agora você sabe o que é isso.

Coletor de lixo

O nome é uma tradução direta da expressão Garbage Collector que as vezes será referenciado apenas por GC. O GC é responsável por pegar memórias reservadas por sua aplicação que não são mais usadas e devolver para o sistema operacional. Quem vem de linguagens como Java, Python e Ruby já deve ter familiaridade com o assunto pois todas tem. Quem vem do C/C++ aprendeu a gerenciar isso no código e provavelmente ter sofrido bastante, por isso algumas linguagens adotam o uso de um GC removendo essa complexidade do programador. Só que já teve que lidar com mallocs e free do C entende esse sofrimento.

Distribuição em binário

Go é uma linguagem que ao ser compilada um binário é gerado que pode ser executado sem grandes problemas dado a diferença que vimos de outra linguagens no tópico de máquina virtual. Esse binário provavelmente poderá ser executado em diversas plataformas mudando as variáveis GOOS e GOARCH, documentação, não vou entrar em detalhes nisso agora mas se tiver curiosidade esse post mostra como funciona isso, o termo é crosscompiling pois permite do Linux gerar um binário Windows, por exemplo.

A saga de gestão de dependências

Go nasceu sem um gerenciador de dependências e ficou por muito tempo sem um oficial até surgir o Go Modules que resolveu isso, antes tivemos várias alternaticas de solução como govendor, glide e go dep, por exemplo. A única coisa que nunca mudou foi a localização delas no seu projeto que é na pasta vendor do seu repositório. Isso foi alvo de muitas polêmicas e motivador para muitos não adotarem Go dado que diversas outras linguagens tem isso já resolvido como o Maven do Java, npm do Javascript e PyPI do Python, por exemplo. Outro detalhe da solução é que ela não conta com um grande servidor central de pacotes, os pacotes no seu projeto vão ser sempre referenciados ao fonte do mesmo, ou seja, se todos os projetos do mundo em Go estivessem no Github, poderiamos dizer que ele era praticamente o Maven, npm, PyPI do Go.

Formatação de código

Em Go essas polêmicas não tem vez, o go fmt dita as regras da organização do seu código, ou você respeita ou ele não compila. Aqui quem manda é o Tab e o { não abre em uma nova linha. Então, fica a dica, configure no seu editor favorito para sempre que salvar um arquivo editado ele rodar sozinho o go fmt antes de salvar, vai te economizar um tempo bom na revisão de código do seu time.

Goroutines

Goroutine

Essa é a característica que acredito ser a mais famosa da linguagem, goroutines, que é um formas qu Go lida com concorrência e paralelismo, usando troca de mensagens via channel, communicating sequential processes ou CSP. Uma outra opção de trabalhar com concorrência em Go é através de memória compartilhada, shared memory multithreading. As pessoas tendem a achar que goroutines são threads mas não são pois elas não são mapeadas diretamente ao sistema operacional como thread igual acontece no Java. Seguem dois textos sobre o assunto:

Comunidade

A comunidade de Go é bastante grande devido ao grande sucesso de várias empresas que adotaram e resolveram seus problemas de escalabilidade e afins com a adoção. Além disso, vários projetos de código aberto foram criados usando Go, vale o destaque para o mais comentado no momento que é o Kubernetes e por grandes empresas que desenvolvem produtos abertos quase todos em Go como a HashiCorp, detalhe, o único projeto deles que não é em Go foi o Vagrant por não existir o Go na época. No Brasil também temos projetos abertos com Go, por exemplo, o tsuru da Globo.com e o pREST da nuveo.

No Brasil hoje temos a nossa conferência nacional que já tem data para 2020, o grupo no Telegram e o Slack que conta com dois canais brasileiros: #brazil e #brazilian-go-studies, o segundo é um grupo de estudo que se reune todas as quintas-feira via hangouts às 22:00h pilotado por Cesar Gimenes. Além disso, diversos meetups regionais:

Empresas

Dificilmente vamos estudar uma tecnologia que não tem mercado de trabalho, né? Sem problemas quanto a isso com Go. Como já mostrei no tópico anterior tem a HashiCorp e Google que criou. Além disso, várias outras empresas dentro e fora do Brasil usam Go, por exemplo, aqui na pagar.me onde trabalho, na Globo.com e na nuveo, Mercado Livre entre outras. Fora do Brasil, temos a Digital Ocean, Form3, SoundCloud, Salesforce, Uber, Twitch.tv e outras. Outras vagas você pode ver aqui, um site especializado em vagas para Go. Na wiki do repositório de Go vocÊ pode encontrar mais empresa que usam.

Fontes de estudo

Livros

YouTube

Cursos online

Podcasts

Editores e IDE's

Vou apenas comentar minha experiência pessoal, eu uso basicamente 3 editores, para escrever no blog e algumas coisas mais rápidas uso o Code que tem um ótimo suporte para Go, por conta do passado com Java também uso o IDEA que também conta com plugin para Go e por fim, e não menos importante, o vim que foi meu editor principal por anos e hoje apenas quando estou no terminal e preciso editar algo sem precisar sair do terminal, o vim também tem um bom suporte a Go.

Go é para mim?

Só você pode decidir isso, eu apresentei algumas característica no começo e acredito com sua própria experiência aprendendo vai ter os seus julgamentos que podem ser diferentes do meu. Eu gosto bastante da linguagem pois me lembra C/C++ que foram linguagens me ajudaram na minha formação como desenvolvedor na graduação e algumas facilidades do Java. Acho que é uma linguagem muito boa para criar aplicações de linha de comando como o exemplo que dei do Terraform e serviços de mais baixo nível como o Kubernetes mas nada impede de ser usado para criar aplicações Web's que podia ser feitas com Rails ou django. A sua familiriadade com a linguagem e do seu time que vão definir mais se ele se ajusta a sua situação.

Próximos artigos

Nos próximos artigos, que pretendo escrever o mais breve possível, vou ainda cobrir alguns tópicos básicos:

  • Instalação do Go
  • Organização de projetos e GOPATH
  • Trabalhando com dependências

Bônus

Atualizações

  • 05/01/2019: Contribuições do Felipe Henrique do Telegram Go Brasil
  • 05/01/2019: Contribuições do Daniel Fernandes do Telegram Go Brasil
  • 06/01/2019: Contribuições do Francisco Oliveira do Telegram Go Brasil