Este documento é um resumo consolidado dos principais conceitos da linguagem Go e seu ecossistema, ideal para quem está começando ou quer reforçar seus conhecimentos.
Última atualização: 05 de julho de 2025
- Fundamentos da Linguagem Go
- Gerenciamento de Dependências com Go Modules
- Concorrência com Goroutines
- Ferramentas Essenciais (
gocommand) - Erros Comuns e Soluções
- Boas Práticas com Git e GitHub
- Outros Conceitos de Desenvolvimento Discutidos
Todo programa executável em Go precisa de uma estrutura mínima para funcionar.
// 1. Declaração do pacote principal
package main
// 2. Importação de pacotes externos
import "fmt"
// 3. O ponto de entrada do programa
func main() {
// 4. A ação a ser executada
fmt.Println("Olá, Mundo!")
}package main: Define o código como um programa executável.import "fmt": Importa a biblioteca padrãofmtpara formatação e impressão de texto.func main(): É a função que é executada quando o programa inicia.
Tecnicamente, func main é:
- O Ponto de Entrada (Entry Point): Onde o runtime do Go começa a executar o seu código.
- A Goroutine Principal: A primeira goroutine a rodar. O programa termina assim que ela finaliza.
Go Modules é o sistema que gerencia as bibliotecas externas (dependências) do seu projeto.
Este arquivo é o manifesto do seu projeto. Ele é crucial porque:
- Define a identidade do seu projeto (
module ...). - Lista as versões exatas de todas as suas dependências diretas e indiretas (
require ...). - Garante Builds Reproduzíveis: Qualquer pessoa, em qualquer máquina, a qualquer momento, irá compilar o projeto usando as mesmas versões de dependências, evitando o problema do "na minha máquina funciona".
Este arquivo contém as checksums (assinaturas criptográficas) de cada dependência. Ele garante que o código que você baixa é autêntico e não foi alterado ou corrompido.
- Você adiciona um
import "nome/do/pacote"no seu código.go. - Você roda o comando
go mod tidyno terminal. - A ferramenta do Go inspeciona seu código, encontra o novo
import, adiciona a dependência aogo.mode aogo.sum, e baixa o código da biblioteca.
É a forma como o Go lida com tarefas concorrentes. Pense nela como uma "thread" extremamente leve e barata, gerenciada pelo runtime do Go, e não diretamente pelo sistema operacional. É possível ter milhões de goroutines rodando simultaneamente.
A criação é simples, usando a palavra-chave go.
package main
import (
"fmt"
"sync"
"time"
)
func main() {
// WaitGroup é usado para esperar as goroutines terminarem.
var wg sync.WaitGroup
// Adiciona 1 ao contador do WaitGroup.
wg.Add(1)
// Inicia a função em uma nova goroutine.
go func() {
// Defer garante que Done() seja chamado ao final da função.
defer wg.Done()
fmt.Println("Executando em outra goroutine...")
time.Sleep(1 * time.Second)
}()
fmt.Println("A main continua seu trabalho...")
// Espera até que o contador do WaitGroup chegue a zero.
wg.Wait()
fmt.Println("A goroutine terminou. Fim do programa.")
}A ferramenta go é o canivete suíço do desenvolvedor. Os comandos mais importantes são:
| Comando | Descrição |
|---|---|
go run |
Compila e executa o programa. Ideal para testes rápidos. |
go build |
Apenas compila o programa, gerando um executável. |
go test |
Executa os testes do projeto. |
go mod tidy |
Sincroniza o go.mod com as importações do código. |
go fmt |
Formata o código-fonte automaticamente segundo as regras do Go. |
go vet |
Analisa o código em busca de erros e construções suspeitas. |
go install |
Compila e instala o binário em um diretório global. |
go doc |
Mostra a documentação de um pacote ou função. |
-
Problema:
go: no go files listed- Causa: Você está tentando rodar um comando
goem uma pasta que não contém arquivos.go. - Solução: Use o comando
cdpara navegar até a pasta correta do seu projeto.
- Causa: Você está tentando rodar um comando
-
Problema:
could not import [pacote] (no required module provides package ...)- Causa: Você adicionou um
importno seu código, mas não atualizou ogo.mod. - Solução: Rode
go mod tidyno terminal para que o Go adicione a nova dependência ao seugo.mod.
- Causa: Você adicionou um
- SIM: Todos os seus arquivos de código (
.go). - SIM: O arquivo
go.mod. - SIM: O arquivo
go.sum. - SIM: O arquivo
.gitignoree outros arquivos de configuração (README.md,Dockerfile, etc.).
Crie um arquivo chamado .gitignore na raiz do projeto para dizer ao Git o que não deve ser enviado.
# Binários compilados
meu-projeto
meu-projeto.exe
# Arquivos de ambiente com segredos
.env
# Pastas de configuração de editores de código
.vscode/
.idea/
# Arquivos de log
*.logDurante nossa conversa, também abordamos brevemente outros tópicos relevantes para o desenvolvimento de software moderno:
- WebSockets: Permitem comunicação bidirecional e persistente entre cliente e servidor, ideal para aplicações em tempo real.
- Funções de Seta (JS): Diferem de funções anônimas principalmente no tratamento do
this, que é herdado do escopo pai (léxico). - TypeScript
strictNullChecks: Força o tratamento explícito de valoresnulleundefined, evitando uma classe inteira de bugs. - Arquitetura de Microsserviços: Trata serviços como componentes independentes que podem ser implantados e atualizados de forma autônoma.
- Aplicações CLI: Programas controlados por texto via linha de comando, valorizados pela eficiência e capacidade de automação.