Golang Criado originalmente por Robert Griesemer, Rob Pike e Ken Thompson na Google, em 2007, se tornando um projeto de código aberto em 2009. Antes do Go essa galera já trabalhou em coisas como UNIX, UTF-8, B Lang, C++...
Hello World Todo código Go estará dentro de um pacote. Para definir o “entry point” de um programa Go, criamos o pacote main seguido da função main. https://dev.to/linivecristine/meu-primeiro-hello-world-em-go-11dh
Simplicidade Um dos focos do Go é a simplicidade, isso é percebido e sentido em tudo que é feito com Go. Desde as decisões de design da linguagem em si até o código que é produzido com ele. Raramente há duas formas de fazer algo em Go.
Simplicidade No Bikeshedding A linguagem não quer te dar espaço para discutir coisas como espaçamentos ou o uso de ; Go possui nativamente ferramentas de linter e formatação que sempre estão presentes durante o desenvolvimento. O debate do código naturalmente fica em torno das regras de negócio e não de como ele poderia ser escrito.
Visibilidade Tudo em go estará dentro de pacotes, a visibilidade desse “tudo” (funções, variáveis, constantes, tipos...) é definida com a presença da letra maiúscula no começo do identificador. A linguagem te incentiva a sempre documentar o que é público.
Retornos múltiplos É possível devolver mais de um valor em uma função. O caso de uso mais comum é o tratamento de erros. De forma geral não há exceções do Go, não há try/catch.
Interfaces Interfaces representam os métodos que uma struct precisa ter. Basta a struct ter os métodos que ela automaticamente será compatível com a interface. A interface nem precisa estar publicamente disponível no módulo.
Defer É muito comum ter que executar alguma coisa “antes” que uma determinada função termine sua lógica. Defer simplifica este cenário, determinada ação marcada com defer será executada antes do retorno/fim da função. https://www.digitalocean.com/community/tutorials/understanding-defer-in-go-pt
Goroutines Paralelismo e concorrência. Go fornece um conjunto de ferramentas dedicadas a situações de multi-threading. Incluindo comunicação entre goroutines e prevenção de race condition. A palavra reservada go faz a execução de uma função ir para “segundo plano”.
Goroutines > Concorrência ou paralelismo? De forma geral não importa, Go vai provisionar as goroutines conforme os recursos (núcleos) da máquina. Também é possível determinar quantos núcleos o programa vai utilizar, criando um controle fino do uso de recursos.
Onde Go Brilha? - Processos concorrentes ou paralelos, quando se precisa extrair o máximo possível do hardware. - Plataformas embarcadas e com poucos recursos. - Ferramentas ou sistemas multi-plataformas.
Onde Go Brilha? - Processamento de grande volume de dados/arquivos. - APIs de alta demanda e baixo custo. - Agentes para interação com recursos do OS ou outros softwares. - Sidecars - Entrega com um único binário.
Entrega com um único binário. Um projeto Go compilado para produção costuma ter tamanho médio de 12MB ~ 30MB, ainda é possível diminuir este tamanho usando técnicas de otimização pós build. Devido a isso deploys com Go costumam ser muito mais rápidos quando comparados a outras stacks.