2 - Conceitos da linguagem Go

Olá, pessoal! Vamos nessa segunda aula do treinamento, vamos conhecer alguns conceitos importantes da linguagem Go.

A história da linguagem Go

Antes de começarmos a escrever nossos primeiros códigos, é importante conhecer um pouco da história da linguagem que iremos utilizar. Afinal, entender por que uma tecnologia foi criada também nos ajuda a compreender as decisões tomadas em seu projeto.

A linguagem Go, também conhecida como Golang, foi criada dentro do Google por Robert Griesemer, Rob Pike e Ken Thompson. O projeto começou em 2007, em um contexto no qual os desenvolvedores buscavam uma linguagem que oferecesse produtividade, simplicidade e velocidade para o desenvolvimento de sistemas modernos.

Na época, grandes projetos de software estavam se tornando cada vez mais complexos. As equipes precisavam lidar com grandes bases de código, muitos desenvolvedores trabalhando simultaneamente e aplicações que exigiam alto desempenho e concorrência.

A proposta do Go foi justamente buscar um equilíbrio entre esses diferentes pontos: uma linguagem simples de aprender e utilizar, com compilação rápida, bom desempenho e recursos para trabalhar facilmente com programas concorrentes.

O código-fonte da linguagem foi disponibilizado publicamente em 2009, permitindo que a comunidade pudesse conhecer, utilizar e contribuir com o projeto. Em 2012, foi lançada a versão 1.0 da linguagem, estabelecendo uma base de compatibilidade que se tornou uma das características importantes do ecossistema Go.

Desde então, Go passou a ser utilizada em diversos projetos, principalmente em aplicações de infraestrutura, serviços de rede, ferramentas de desenvolvimento, APIs, sistemas distribuídos e aplicações que precisam lidar com muitas operações simultaneamente.

Quem criou o Go?

  • Robert Griesemer: participou do projeto da linguagem e de seu compilador.
  • Rob Pike: conhecido por seu trabalho em sistemas e linguagens de programação, participou ativamente do desenvolvimento do Go.
  • Ken Thompson: um dos criadores da linguagem C e do sistema operacional Unix, também participou da criação do Go.

Uma curiosidade interessante é que os criadores da linguagem possuem uma longa história no desenvolvimento de sistemas e ferramentas utilizadas pela indústria de software. Isso ajuda a explicar a preocupação do Go com simplicidade, ferramentas de desenvolvimento, desempenho e facilidade de manutenção.

Principais características da linguagem Go

Agora que conhecemos um pouco da história, podemos entender melhor quais são as características que tornam o Go uma linguagem diferente de outras opções disponíveis no mercado.

Simplicidade

Uma das principais ideias por trás do Go é manter a linguagem simples. Em vez de oferecer uma quantidade enorme de recursos e possibilidades diferentes para resolver o mesmo problema, Go procura fornecer ferramentas objetivas para que o desenvolvedor consiga escrever códigos fáceis de entender e manter.

Essa característica também contribui para que novos desenvolvedores consigam aprender a linguagem de maneira relativamente rápida.

Compilação

Go é uma linguagem compilada. Isso significa que o código-fonte escrito pelo desenvolvedor passa por um processo de compilação antes de ser executado.

Uma das grandes vantagens desse modelo é a possibilidade de gerar executáveis que podem ser distribuídos e executados sem a necessidade de disponibilizar todo o código-fonte da aplicação.

Tipagem estática

Go possui tipagem estática. Em outras palavras, os tipos das variáveis são conhecidos durante a compilação, permitindo que diversos problemas sejam identificados antes mesmo da aplicação ser executada.

A linguagem também possui recursos que reduzem a quantidade de código necessário para declarar variáveis, como a inferência de tipos.

Concorrência

Uma das características mais conhecidas do Go é o suporte à concorrência. A linguagem possui as goroutines, que permitem executar funções de maneira concorrente, e os channels, utilizados para comunicação e sincronização entre partes concorrentes de um programa.

Esse modelo facilita o desenvolvimento de aplicações que precisam realizar várias tarefas simultaneamente, como servidores, APIs e sistemas que trabalham com operações de rede.

Garbage Collector

Go possui gerenciamento automático de memória por meio de um garbage collector. Dessa forma, o desenvolvedor não precisa realizar manualmente todas as operações relacionadas à liberação de memória.

Isso reduz a complexidade do código e ajuda a evitar determinados problemas comuns em linguagens nas quais o gerenciamento de memória é realizado manualmente.

Ferramentas oficiais

Outro ponto muito interessante do Go é o conjunto de ferramentas que acompanha a própria linguagem. Entre elas, podemos destacar ferramentas para compilação, execução, gerenciamento de módulos, testes e formatação de código.

Um exemplo bastante conhecido é o gofmt, responsável por formatar automaticamente o código Go de acordo com o padrão adotado pela linguagem.

Isso é especialmente útil em equipes, pois reduz discussões sobre estilos diferentes de formatação e permite que os desenvolvedores mantenham uma aparência consistente no código.

Curiosidades sobre Go

Além das características técnicas, existem algumas curiosidades interessantes que podemos conhecer antes de colocar a linguagem em prática.

  • O Go foi criado por engenheiros do Google, incluindo Ken Thompson, um dos criadores da linguagem C e do Unix;
  • O projeto começou em 2007 e foi apresentado publicamente em 2009;
  • A versão 1.0 da linguagem foi lançada em 2012;
  • O nome oficial da linguagem é Go, embora muitas pessoas utilizem o termo Golang para diferenciá-la de outros usos da palavra “Go”;
  • O mascote oficial da linguagem é o Gopher, um pequeno animal inspirado nos roedores conhecidos como gophers;
  • Go possui uma forte preocupação com ferramentas de desenvolvimento, incluindo formatação, testes e gerenciamento de dependências;
  • O projeto Docker, uma das tecnologias mais conhecidas do ecossistema de containers, possui grande parte de sua implementação escrita em Go;
  • Kubernetes, uma das principais plataformas utilizadas para orquestração de containers, também é desenvolvido principalmente em Go;
  • A linguagem foi projetada pensando especialmente em aplicações modernas, redes, sistemas distribuídos e grandes bases de código.

Quais projetos podemos desenvolver com Go?

Agora chegamos a uma pergunta muito importante: depois de aprender Go, onde podemos utilizar essa linguagem?

Embora seja possível utilizar Go em diferentes tipos de aplicações, existem alguns cenários nos quais suas características se destacam bastante.

APIs e aplicações Web

Go é uma excelente opção para desenvolver APIs e serviços Web. Sua biblioteca padrão possui recursos para trabalhar com HTTP, JSON, servidores e comunicação em rede, permitindo criar aplicações sem depender obrigatoriamente de grandes frameworks.

Podemos utilizar Go para criar desde APIs simples para estudos até serviços utilizados em ambientes de produção.

Microsserviços

Outra utilização bastante comum é o desenvolvimento de microsserviços. Como o Go consegue gerar executáveis compactos e possui bom desempenho, ele se adapta muito bem a aplicações distribuídas.

Também podemos utilizar suas funcionalidades de concorrência para criar serviços capazes de lidar com diversas operações simultaneamente.

Ferramentas de linha de comando

Go também é uma ótima escolha para desenvolver aplicações executadas diretamente pelo terminal.

Podemos criar ferramentas para automatizar tarefas, manipular arquivos, processar informações, realizar operações de rede ou auxiliar outras equipes de desenvolvimento.

Cloud e infraestrutura

O ecossistema de infraestrutura e computação em nuvem possui forte presença de aplicações desenvolvidas em Go. Ferramentas relacionadas a containers, orquestração, observabilidade e automação utilizam a linguagem em diversos projetos.

Por isso, aprender Go pode ser especialmente interessante para quem pretende trabalhar com infraestrutura, DevOps, Cloud ou sistemas distribuídos.

Processamento concorrente

Projetos que precisam executar várias tarefas simultaneamente também podem se beneficiar bastante da linguagem.

Podemos imaginar, por exemplo, uma aplicação responsável por processar milhares de arquivos, realizar diversas requisições HTTP ou consumir mensagens de diferentes fontes. Nesses cenários, os recursos de concorrência do Go podem ser muito úteis.

O que não significa que Go deve ser usada para tudo

É importante lembrar que não existe uma linguagem de programação perfeita para todos os tipos de projetos.

Go possui excelentes características para determinados cenários, mas a escolha de uma tecnologia deve levar em consideração os requisitos do projeto, a equipe, o ecossistema disponível, a infraestrutura e os objetivos da aplicação.

Durante nosso treinamento, o objetivo não será apenas aprender a sintaxe do Go. Também queremos desenvolver a capacidade de analisar problemas e entender quando determinadas ferramentas e tecnologias fazem sentido.

Como escolher nosso primeiro projeto em Go?

Uma das melhores maneiras de aprender uma linguagem de programação é colocando seus conhecimentos em prática. Por isso, ao longo do treinamento, podemos evoluir nossos projetos gradativamente.

Nível 1 - Projetos básicos

  • Calculadora no terminal;
  • Conversor de unidades;
  • Programa para verificar números pares e ímpares;
  • Cadastro simples de usuários utilizando structs;
  • Jogo de adivinhação;
  • Gerador de informações utilizando entrada do usuário.

Nível 2 - Projetos intermediários

  • Lista de tarefas (To-Do List);
  • Sistema de cadastro utilizando arquivos;
  • Leitor e processador de arquivos;
  • Consumidor de uma API externa;
  • API HTTP simples;
  • Programa concorrente para processamento de dados.

Nível 3 - Projetos avançados

  • API REST completa;
  • Microsserviço;
  • Sistema utilizando banco de dados;
  • Processamento assíncrono utilizando concorrência;
  • Serviço de comunicação entre aplicações;
  • Ferramenta de linha de comando para automação.

A ideia é começar com problemas pequenos e aumentar gradativamente a complexidade. Dessa maneira, conseguimos aplicar os conceitos aprendidos sem tentar construir uma aplicação grande antes de dominar os fundamentos.