Porque eu amo Golang

Eu amo a linguagem de programação Go, ou como alguns se referem a ela, Golang. É simples e é ótimo.

Eu escrevo isso em uma tangente. Não esperava que Golang fosse tão bom.

Eu peguei pela primeira vez em janeiro de 2016, tinha uma comunidade relativamente pequena, mas entusiasmada, aqui em Israel.

Eu não pensava muito nisso na época, estava aprimorando minhas habilidades de programação e Golang era apenas uma ferramenta que eu usei para realizar uma tarefa.

Até um ano atrás, usar o go foi brilhante. O processo foi direto, uma vez que eu tenho o jeito geral da linguagem.

Escrevi uma parte crucial do código para a Visualead , a empresa para a qual trabalho, e ela não nos decepcionou, e ainda está em produção um ano depois, com manutenção zero desde então.

Recentemente eu me encontrei novamente usando Golang novamente, e me senti compelido a escrever sobre as razões pelas quais me apaixonei por Golang.

O ambiente GOPATH

Esta é uma das primeiras coisas que você terá que lidar quando começar a escrever no Go.

Configure seu diretório GOPATH em qualquer lugar no seu computador, completo com diretórios bin, src e pkg e você estará pronto para começar a escrever.

 // Como a estrutura do diretório se parece: 
ir
- bin
- pkg
- src

Sob meu diretório home eu crio um novo diretório para cada linguagem de programação que eu escrevo. Meu diretório home do usuário é preenchido com pastas como estas:

 chefe de cozinha 
cpp
elixir
olmo
ir
javascript
meteoro
ocaml
php
python
scala

Nenhuma dessas linguagens aplica essa estrutura além do Go. Vá forçá-lo a definir um diretório raiz para todos os seus itens Golang, e ele faz isso por boas razões que estão chegando.

O aplicativo de Golang

Quer criar um novo aplicativo Golang? Simples.

Vá para o $GOPATH/src , crie uma nova pasta, crie um novo file.go , chame o pacote main , adicione uma func main() {} e é isso. Todos os presentes Go estão disponíveis para você desde aquele momento em diante.

Mais sobre Go goodies chegando! mas primeiro algumas palavras sobre os módulos de Golang.

Os módulos de Golang

Meu paradigma de programação favorito feito corretamente. Eu vejo o sistema de módulos como uma espécie de alternativa ao sistema de classes Orientado a Objetos.

Golang chama seus pacotes de módulos. Então, a partir de agora toda vez que dizemos um módulo, queremos dizer um pacote e vice-versa.

 Módulo == Pacote == Módulo 

Em Golang, cada diretório que você cria se torna um pacote. Um pacote pode se tornar um aplicativo se o nome for main . Isso ajuda com uma separação natural de código em partes lógicas gerenciáveis.

Você sempre quer que sua lógica de negócios seja criada a partir de componentes reutilizáveis, ou pacotes no caso de Golang.

No meu aplicativo atual eu tenho que manipular algumas linhas em alguns arquivos, e carregá-los para o AWS S3 assim que eu terminar.

A estrutura do meu aplicativo é assim:

 src 
- my_app
- - main.go
- - main_test.go
- - uploader
- - - uploader.go
- - - uploader_test.go
- - replace_file_lines
- - - replace.go
- - - replace_test.go
- - - strings_util.go
- - - strings_util_test.go

Os arquivos _test.go são, é claro, a maneira de fazer arquivos de teste unitários para o Golang, que possui um framework de testes embutido em seu núcleo.

Também para aqueles que estão vindo de uma linguagem orientada a objetos, é útil pensar que cada diretório aqui é uma classe estática completa, e cada função ou variável dentro dos arquivos .go se torna uma propriedade ou método.

Veja um exemplo possível de como replace.go pode ser:

Se um diretório compartilhar mais de um arquivo .go , todos os métodos e variáveis ??serão compartilhados entre o pacote inteiro e até os privados. Isso ajuda a separar um pacote em partes ainda menores e a evitar arquivos grandes e únicos.

Sem entrar em Objeto Orientado versus Funcional / Processual, é importante saber que os criadores do Google decidiram não incluir classes clássicas no idioma. Em vez disso, optou por usar structs / interfaces e pacotes de curso.

O Golang gofmt

Golang tem uma convenção de como tudo deve parecer, o espaçamento exato que é necessário em cada caso e cada linha.

Isso permite que os desenvolvedores se concentrem em escrever código, em vez de travar guerras sobre locais de chaves.

A velha guerra {} vs { n}:

Ou talvez eu seja apenas feliz porque meu time ganhou em Go?

Leia mais sobre isso aqui: https://golang.org/cmd/gofmt/

A importação de Golang

as importações são sempre relativas a GOPATH/src . Sempre. Não posso exagerar o quanto essas decisões me salvam em frustração.

Aviso: a próxima linha é confusa por intenção.

Ao trabalhar com outras linguagens, você pode usar importações relativas / absolutas ou, de alguma forma, definir uma importação estranha que permitirá a importação de um arquivo de whoknowswhere location (estou olhando para você, Python).

Vá resolve de uma forma única. Todas as importações, não importa em qual arquivo, sempre serão relativas a GOPATH/src

Então, no caso do my_app, as principais importações serão assim:

my_app está em src, então precisamos mencioná-lo primeiro, depois importamos os pacotes que existem sob my_app , como uploader e replace_file_lines . Observe que não estamos importando arquivos únicos, mas sim pacotes inteiros. Funciona como um encanto e causa confusão ZERO.

Além disso, o Golang não irá compilar a menos que você realmente use os pacotes que você importa, este pequeno recurso ajuda você a saber que toda importação é realmente usada.

Esperando que seus programadores escrevam um código limpo sem importações não utilizadas? por que você não deixa seu Gopher local cuidar disso?

O sistema Golang Get

As seções de importação nos levam para a próxima grande característica do Golang, o recurso go get . Enquanto outros estão impressionados com o gerenciador de pacotes JavaScripts NPM , o Go apenas usa qualquer repositório git como gerenciador de pacotes.

Como funciona?

Eu escrevi antes que eu precisava fazer o upload para o S3, certo? bem, então isso significa que preciso do AWS SDK para realizar isso.

Para fazer isso funcionar, eu só abro meu terminal e escrevo:

 go get github.com/aws/aws-sdk-go 

Oque esta acontecendo aqui? Nada de especial, Golang apenas baixa o repo de https://github.com/aws/aws-sdk-go para o seu diretório GOPATH/src .

Então tudo que você precisa fazer para usar o aws-sdk é apenas importá-lo:

Lembre-se que todas as importações são relativas ao GOPATH/src ? A partir disso você pode entender que o pacote s3 , por exemplo, reside agora em GOPATH/src/github.com/aws/aws-sdk-go/services/s3 .

Simples. Elegante. Outra estrela para o gopher.

Os sistemas de construção e embalagem de Golang

Nós nos concentramos até agora em GOPATH/src mas ainda existem outros diretórios que precisamos abordar, GOPATH/pkg e GOPATH/bin .

Golang é uma linguagem compilada, isso significa que o código deve ser compilado para ser executado. Golang é compilado rapidamente. Como funciona?

Toda vez que você compila seu código para executá-lo, o Golang cria um arquivo .a no mesmo caminho do seu pacote, somente sob o diretório GOPATH/pkg . Isso significa que se você compilou o aws-sdk por exemplo. Ele será compilado uma vez e compartilhado entre todos os outros códigos.

É claro que essa não é a única razão pela qual Golang compila rápido, mas é apenas uma introdução que ajuda você a entender o papel do GOPATH/pkg

Agora, e o GOPATH/bin ? Quando você executa o comando go install , vai cria um arquivo binário e coloca-o sob GOPATH/bin , o arquivo obtém o nome do diretório do my-app pacote principal my-app no nosso caso.

Por que isso é tão bom? Bem, você pode adicionar GOPATH/bin em sua variável global PATH , e todos os binários de sua compilação estão disponíveis em sua linha de comando, sem que você faça nenhum trabalho extra! (Não é ótimo: D?)

Construções da plataforma de Golang Cross

Implantando em outras distribuições ao invés da que você está escrevendo seu código? Bem, não se preocupe, você não precisa ter uma máquina Windows para construir seu código para o Windows. Golang te cobriu.

Apenas corra:

 GOOS=windows GOARCH=amd64 go install 

E nosso código gerará um binário pronto para ser implantado em uma máquina Windows. O arquivo .exe aparecerá em GOPATH/bin/windows_amd64/my_app.exe . Como um passeio no parque.

A língua de Golang

Golang é destinado a ser uma linguagem simples.

Adoro o seguinte post perguntando por que o Go não foi projetado para ser uma linguagem funcional: https://www.quora.com/Why-wasnt-Go-written-as-a-functional-language

“Os programadores que trabalham no Google estão no início de suas carreiras e estão mais familiarizados com as linguagens procedurais, principalmente da família C. A necessidade de obter programadores produtivos rapidamente em um novo idioma significa que a linguagem não pode ser muito radical ”

E simples é isso.

Aqui está uma lista de alguns recursos que o Golang não suporta:

  1. Classes
  2. Operadores sobrecarregando
  3. Sobrecarga de função
  4. Parâmetros opcionais
  5. exceções

Embora às vezes eu me ache faltando características de idioma ao escrever em Go, eu sempre posso fazer tudo o que eu quero. Apenas às vezes requer mais escrita e às vezes pensando. A linha inferior é, conduz ao código que é mais fácil de raciocinar porque é menos abstrato.

Às vezes, me surpreende a rapidez com que consigo atingir um objetivo ao escrever em Go, sem ter anos de experiência, só porque a linguagem é tão complacente e clara.

A Concorrência de Golang

Eu deixei a conversa de simultaneidade por intenção de ser a última. Por quê? porque não acho que seja tão importante.

É uma característica incrível da linguagem. Mas às vezes é apresentado como a essência do Go, que eu acredito que não é.

Portanto, deixe-me tentar resumir em um parágrafo.

Sim, Golang tem grande concorrência. Você não lida com tópicos, mas cria gorouts baratos que são simples de fazer e gerenciar. Os Goroutines permitem distribuir a carga em todas as CPUs sem se preocupar em como gerenciar tudo isso.

Ainda interessado em entender goroutines? Leia sobre eles aqui: https://tour.golang.org/concurrency/1

Atualização 2017–06–13:
Verifique a resposta de Inanc Gumus para ler uma versão interessante sobre a simultaneidade de Golang

O Gopher Golang

Vamos lá, ele é tão bonito!

Texto original em inglês.