Um primeiro programa em Go precisa de uma ferramenta de linha de comando, um arquivo go.mod e um pacote chamado main. Veja o que go run, go build, gofmt e go vet fazem, e por que Go não compila código com um import sem uso.
Toda variável em Go começa com um zero value, números nunca se convertem sozinhos e constantes são mais flexíveis que variáveis. Aprenda var, :=, inteiros com tamanho, overflow, iota e os verbos do Printf para inspecionar valores.
Go se vira com if, uma única palavra-chave de laço chamada for e um switch que não cai no próximo caso. Aprenda cada forma, a mudança do Go 1.22 que dá a cada iteração sua própria variável, e o break com label.
Funções em Go podem retornar vários valores, carregar variáveis como closures e agendar a limpeza com defer. Veja como cada um funciona, incluindo a ordem em que as chamadas adiadas rodam e quando os argumentos delas são fixados.
Um slice em Go é uma pequena janela sobre um array que guarda os valores de verdade. Quando você enxerga a janela, len, cap, append e o bug em que dois slices mudam um ao outro deixam de ser mistério.
Um map em Go guarda valores sob chaves e os encontra por hash. Veja por que uma chave ausente dá o zero value, por que escrever num map nil causa panic e por que a ordem de iteração muda de uma execução para outra.
Uma string em Go é uma sequência de bytes somente leitura, normalmente UTF-8. Quando você enxerga isso, len contando bytes, o índice dando um byte, o range dando runes e um fatiamento que parte um caractere ao meio passam a fazer sentido.
Structs em Go são valores, então toda atribuição e toda chamada fazem uma cópia. Ponteiros deixam você compartilhar uma única struct, e receivers de ponteiro são o jeito de um método mudar o valor em que foi chamado.
Uma interface em Go é uma lista de métodos, e qualquer tipo com esses métodos a satisfaz sem precisar dizer isso. Veja method sets, Stringer, io.Reader, type switches e por que um error com um ponteiro nil dentro não é nil.
Erros em Go são valores comuns que você retorna e confere. Aprenda a envolvê-los com contexto, achar a causa com errors.Is e errors.As, juntar vários de uma vez e deixar panic e recover para bugs de verdade.
Um módulo Go é uma árvore de pacotes sob um único go.mod. Veja como funcionam import paths, nomes exportados e pastas internal, e depois teste o código com testes table-driven, subtests, examples e benchmarks.
Generics em Go deixam uma função servir para muitos tipos, com constraints dizendo quais tipos são permitidos. Iteradores deixam uma função entregar valores um de cada vez a um loop for, e parar no instante em que o loop dá break.
Go decide por você se um valor vive na stack ou no heap. Veja como a escape analysis toma essa decisão, como observá-la com go build -gcflags=-m, como contar alocações e o que o garbage collector faz depois.
Uma goroutine é uma função que roda junto com o resto do seu programa, e o Go consegue rodar milhares delas ao mesmo tempo. Veja como iniciá-las, esperar por elas, evitar vazamentos e como o scheduler divide poucas threads entre elas.
Um channel em Go passa valores entre goroutines e faz uma esperar pela outra. Aprenda channels com e sem buffer, fechamento, deadlocks, channels nil e como o select espera em vários ao mesmo tempo.
Duas goroutines que mudam a mesma variável sem coordenação causam um data race e perdem atualizações em silêncio. Veja como sync.Mutex, RWMutex, atomic e Once evitam isso, e como go run -race encontra o problema.
Um context em Go avisa cada goroutine de um trabalho quando parar. Aprenda cancelamento, timeouts e valores de requisição, e depois monte um worker pool, um pipeline, fan-out, um errgroup e um semáforo que nunca vazam.
A biblioteca padrão do Go traz um servidor HTTP pronto para produção. Aprenda handlers, roteamento com padrões de método e caminho no ServeMux, as regras do ResponseWriter, o que acontece com cada requisição e por que o http.Server precisa de timeouts.
Uma API REST de lista de tarefas em Go sem pacotes de terceiros. Construa o store, as rotas, a decodificação segura de JSON, a validação, os status codes, o middleware e os logs com slog, uma camada por vez.
Teste uma API REST em Go com httptest, um store fake, verificações de log, o race detector e fuzzing. Depois coloque em produção com timeouts no servidor, graceful shutdown e um único binário estático.