← Ver a árvore completa

ROTA · 62 CLASSES · 8 GRUPOS

Imersão Go

Construa uma base completa de Go, da sintaxe aos projetos e à concorrência.

Pré-requisitos orientam, mas nunca bloqueiam. Cinco classes da árvore são grátis com conta.

O ARCO DA ROTA

01Fundamentos02Dados03Funções04Idiomático05Concorrência06CLI07Testes08Web

ORDEM RECOMENDADA

62 classes, do primeiro passo ao fechamento.

Cada classe leva cerca de 15–25 minutos no novo formato de slides. Você pode sair da ordem quando outro nó fizer mais sentido.

  1. 01
    Primeiros passosBem-vindo ao Go: por que a linguagem existe e seu primeiro programa rodando

    O que é Go, por que a infraestrutura da internet é escrita nele e como este curso funciona — com seu primeiro programa compilando e rodando no navegador.

  2. 02
    Primeiros passosHello, World e a toolchain: go run, go build e go mod sem mistério

    O ciclo go run, go build e go mod explicado de ponta a ponta: o que cada comando faz, quando usar cada um e por que o binário de Go não precisa de runtime.

  3. 03
    Primeiros passosValores e tipos: o que a tipagem estática garante (e o que ela recusa)

    Os tipos básicos de Go — int, float64, string e bool — e a regra que muda seu jeito de programar: nada se converte sozinho.

  4. 04
    Primeiros passosVariáveis: var, := e o fim do undefined

    As duas formas de declarar variáveis em Go, quando usar cada uma e a garantia dos zero values: toda variável nasce com um valor útil, nunca indefinida.

  5. 05
    Primeiros passosConstantes e iota: valores que o compilador garante que nunca mudam

    const, as constantes não tipadas que flexibilizam a regra dos tipos de forma segura, e o iota que gera enumerações sem números mágicos.

  6. 06
    Controle de fluxofor: o único loop de Go e todas as suas formas

    As quatro formas do for — completo, estilo while, infinito e range — mais break, continue e a execução passo a passo de um loop de verdade.

  7. 07
    Controle de fluxoif e else: decisões com escopo curto e o padrão que define Go

    O if de Go sem parênteses e sem truthy, o init statement que limita escopo, early returns no lugar de else — e o primeiro contato com if err != nil.

  8. 08
    Controle de fluxoswitch: comparações múltiplas sem a armadilha do fallthrough

    O switch de Go que não vaza entre cases, a forma sem expressão que substitui cadeias de if, múltiplos valores por case e a prévia do type switch.

  9. 09
    Controle de fluxodefer: a limpeza garantida que roda na ordem inversa

    Como defer agenda chamadas para o fim da função, por que a ordem é LIFO, quando os argumentos são avaliados e o padrão abrir-defer-fechar que percorre todo código Go.

  10. 10
    Tipos CompostosArrays: o tamanho faz parte do tipo e a cópia é total

    Arrays em Go têm tamanho fixo gravado no tipo e semântica de valor: atribuir ou passar um array copia todas as posições. Entenda quando isso ajuda e por que os slices existem.

  11. 11
    Tipos CompostosSlices: a janela flexível que substitui o array no dia a dia

    Slices são a coleção padrão de Go: crescem com append, fatiam com s[a:b] e compartilham o array por baixo. Aprenda a criar, estender e fatiar sem surpresas.

  12. 12
    Tipos CompostosSlices por dentro: len, cap e o array subjacente

    Entenda o header de um slice, a diferença entre len e cap e quando append preserva ou troca o array subjacente.

  13. 13
    Tipos CompostosMaps: busca direta por chave, comma-ok e a ordem que não existe

    Maps associam chaves a valores com busca média O(1): criação com make, leitura com comma-ok, delete, range sem ordem garantida e o zero value que dispensa inicialização.

  14. 14
    Tipos CompostosStructs: campos nomeados, cópia por valor e o modelo do seu domínio

    Structs agrupam campos nomeados em um tipo seu: literal com nomes, acesso com ponto, zero value útil, comparação com == e a mesma semântica de cópia total dos arrays.

  15. 15
    Tipos CompostosPonteiros: o endereço que permite alterar à distância — sem aritmética

    Ponteiros em Go: & captura o endereço de uma variável, * lê e escreve a célula apontada. Quando usar, o que o nil significa e por que não existe aritmética de ponteiros.

  16. 16
    Tipos CompostosStrings e runas: bytes por baixo, letras por cima

    Strings em Go são bytes imutáveis em UTF-8: len conta bytes, indexar devolve byte, range decodifica runas. Aprenda a contar, inverter e truncar texto sem corromper acentos.

  17. 17
    Tipos CompostosEnums com iota: estados nomeados que o compilador confere

    Transforme int solto em estado nomeado: tipos definidos com constantes iota, zero value com significado, parse com comma-ok e flags de bits — o enum idiomático de Go.

  18. 18
    FunçõesFunções: a assinatura é o contrato — e funções são valores

    Funções em Go: assinaturas tipadas sem overload nem argumentos padrão, funções anônimas e funções como valores — passadas como parâmetro, guardadas em slices e maps.

  19. 19
    FunçõesMúltiplos retornos: valor e veredito na mesma assinatura

    Funções Go devolvem mais de um valor: quociente e resto, valor e ok, resultado e erro. Aprenda a receber, descartar com _, nomear retornos e desenhar contratos sem valores mágicos.

  20. 20
    FunçõesVariádicas: a assinatura que aceita quantos argumentos vierem

    Funções variádicas em Go: values ...int empacota argumentos em um slice, reticências espalham um slice existente, e o design de assinaturas como Max(first, rest...) elimina casos inválidos.

  21. 21
    FunçõesClosures: funções que carregam o ambiente onde nasceram

    Closures em Go: funções anônimas que capturam variáveis do escopo — por referência, não por cópia. Contadores, acumuladores, memoização e a captura em loops do Go moderno.

  22. 22
    FunçõesRecursão: o problema que se resolve com uma versão menor de si

    Recursão em Go: caso base, passo recursivo e a pilha de chamadas frame a frame. Fatorial, soma de dígitos, árvores de diretórios — e quando preferir um loop.

  23. 23
    FunçõesRange over iterators: o for range que percorre o que você definir

    Iteradores de função do Go 1.23+: func(yield) percorrível com for range, sequências preguiçosas e infinitas, iter.Seq, break que propaga e combinadores como Take.

  24. 24
    Métodos, interfaces e genericsMétodos: comportamento ligado ao tipo certo

    Domine métodos: comportamento ligado ao tipo certo com programas completos e exercícios testados.

  25. 25
    Métodos, interfaces e genericsInterfaces: contratos satisfeitos sem declaração

    Domine interfaces: contratos satisfeitos sem declaração com programas completos e exercícios testados.

  26. 26
    Métodos, interfaces e genericsInterfaces na prática: Reader, Writer e Stringer

    Domine interfaces na prática: reader, writer e stringer com programas completos e exercícios testados.

  27. 27
    Métodos, interfaces e genericsStruct embedding: composição com promoção deliberada

    Domine struct embedding: composição com promoção deliberada com programas completos e exercícios testados.

  28. 28
    Métodos, interfaces e genericsGenerics: algoritmos tipados com constraints

    Domine generics: algoritmos tipados com constraints com programas completos e exercícios testados.

  29. 29
    Métodos, interfaces e genericsGenerics na prática: reutilize só onde compensa

    Domine generics na prática: reutilize só onde compensa com programas completos e exercícios testados.

  30. 30
    ErrosErrors: falhas são valores, não exceções

    Domine errors: falhas são valores, não exceções com programas completos e exercícios testados.

  31. 31
    ErrosErros customizados: dados para decisões melhores

    Domine erros customizados: dados para decisões melhores com programas completos e exercícios testados.

  32. 32
    ErrosWrapping de erros: contexto sem perder a causa

    Domine wrapping de erros: contexto sem perder a causa com programas completos e exercícios testados.

  33. 33
    ErrosPanic, defer e recover: contenha o inesperado

    Domine panic, defer e recover: contenha o inesperado com programas completos e exercícios testados.

  34. 34
    ErrosEstratégia de erros: contexto, decisão e tratamento único

    Domine estratégia de erros: contexto, decisão e tratamento único com programas completos e exercícios testados.

  35. 35
    Concorrência IGoroutines: trabalho concorrente com ciclo de vida claro

    Aprenda goroutines: trabalho concorrente com ciclo de vida claro com visualização passo a passo, código executável e exercícios determinísticos.

  36. 36
    Concorrência IChannels: comunicação e sincronização entre goroutines

    Aprenda channels: comunicação e sincronização entre goroutines com visualização passo a passo, código executável e exercícios determinísticos.

  37. 37
    Concorrência IChannels com buffer: capacidade, bloqueio e pressão

    Aprenda channels com buffer: capacidade, bloqueio e pressão com visualização passo a passo, código executável e exercícios determinísticos.

  38. 38
    Concorrência ISincronização com channels: conclusão e happens-before

    Aprenda sincronização com channels: conclusão e happens-before com visualização passo a passo, código executável e exercícios determinísticos.

  39. 39
    Concorrência IDireções de channel: contratos de produtor e consumidor

    Aprenda direções de channel: contratos de produtor e consumidor com visualização passo a passo, código executável e exercícios determinísticos.

  40. 40
    Concorrência Iselect: coordenando múltiplas comunicações prontas

    Aprenda select: coordenando múltiplas comunicações prontas com visualização passo a passo, código executável e exercícios determinísticos.

  41. 41
    Concorrência ITimeouts e cancelamento sem vazar goroutines

    Aprenda timeouts e cancelamento sem vazar goroutines com visualização passo a passo, código executável e exercícios determinísticos.

  42. 42
    Concorrência IOperações não bloqueantes com select e default

    Aprenda operações não bloqueantes com select e default com visualização passo a passo, código executável e exercícios determinísticos.

  43. 43
    Concorrência IFechando channels: propriedade, comma-ok e fim do fluxo

    Aprenda fechando channels: propriedade, comma-ok e fim do fluxo com visualização passo a passo, código executável e exercícios determinísticos.

  44. 44
    Concorrência Irange sobre channels: drenar até o fechamento

    Aprenda range sobre channels: drenar até o fechamento com visualização passo a passo, código executável e exercícios determinísticos.

  45. 45
    Concorrência IIWaitGroup: esperar um conjunto dinâmico de goroutines

    Aprenda waitgroup: esperar um conjunto dinâmico de goroutines com visualização passo a passo, código executável e exercícios determinísticos.

  46. 46
    Concorrência IIWorker pools: concorrência limitada e shutdown completo

    Aprenda worker pools: concorrência limitada e shutdown completo com visualização passo a passo, código executável e exercícios determinísticos.

  47. 47
    Concorrência IIRate limiting: tokens, rajadas e testes determinísticos

    Aprenda rate limiting: tokens, rajadas e testes determinísticos com visualização passo a passo, código executável e exercícios determinísticos.

  48. 48
    Concorrência IIOperações atômicas: contadores sem data race

    Aprenda operações atômicas: contadores sem data race com visualização passo a passo, código executável e exercícios determinísticos.

  49. 49
    Concorrência IIMutexes: protegendo invariantes compartilhadas

    Aprenda mutexes: protegendo invariantes compartilhadas com visualização passo a passo, código executável e exercícios determinísticos.

  50. 50
    Concorrência IIEstado por goroutine: um único dono e mensagens

    Aprenda estado por goroutine: um único dono e mensagens com visualização passo a passo, código executável e exercícios determinísticos.

  51. 51
    Concorrência IIContext: cancelamento propagado e limites de trabalho

    Aprenda context: cancelamento propagado e limites de trabalho com visualização passo a passo, código executável e exercícios determinísticos.

  52. 52
    Stdlib essencialstrings e strconv: a oficina de texto da stdlib

    Domine as funções de strings e strconv que todo programa Go usa: Split, TrimSpace, Cut, Builder e as conversões seguras entre texto e número.

  53. 53
    Stdlib essencialfmt e formatação: verbos, largura e o contrato do Stringer

    Aprenda os verbos do fmt de %v a %q, controle largura e precisão, formate dinheiro sem float e implemente fmt.Stringer nos seus tipos.

  54. 54
    Stdlib essencialJSON em Go: struct tags, Marshal e as fronteiras do seu programa

    Serialize e desserialize JSON com encoding/json: struct tags, omitempty, campos ausentes versus zero, e agregação de dados que chegam de fora.

  55. 55
    Stdlib essencialtime: instantes, durações e o layout de referência

    Trabalhe com datas e horas em Go: o layout de referência 2006-01-02, aritmética com Duration, fusos horários e as armadilhas de AddDate.

  56. 56
    Stdlib essencialregexp: padrões de texto com garantia de tempo linear

    Use regexp em Go: MustCompile, grupos de captura com FindStringSubmatch, substituições com ReplaceAll e a garantia RE2 de tempo linear.

  57. 57
    Stdlib essencialsort e o pacote slices: ordenar, buscar e manter ordenado

    Ordene com slices.Sort e SortFunc, entenda estabilidade e comparadores, busque com BinarySearch e mantenha coleções ordenadas com Insert.

  58. 58
    Do código ao projetogo.mod e dependências: builds reproduzíveis com Minimal Version Selection

    Entenda módulos Go: a anatomia do go.mod, o papel do go.sum, semver e como o algoritmo Minimal Version Selection escolhe cada versão do build.

  59. 59
    Do código ao projetotesting: tabelas de casos e o go test

    Escreva testes em Go com tabelas de casos: go test, t.Run, t.Errorf, a convenção got/want e testes como especificação executável.

  60. 60
    Do código ao projetohttp client: requisições, respostas e os três pecados capitais

    Use o client HTTP da stdlib: monte requisições com headers e query strings, trate status e corpo com defer Close, e teste tudo com transporte falso.

  61. 61
    Do código ao projetohttp server: handlers, ServeMux moderno e testes sem rede

    Construa servidores HTTP com o ServeMux do Go 1.22: method patterns, wildcards com PathValue, respostas JSON e handlers testados com httptest.

  62. 62
    Do código ao projetoProjeto final: uma CLI de tarefas juntando toda a trilha

    O capstone da trilha: construa uma CLI de gestão de tarefas em quatro etapas — parser de argumentos, storage em memória, filtros e formatação de saída.

PRÉVIA DA PRIMEIRA CLASSE

Bem-vindo ao Go: por que a linguagem existe e seu primeiro programa rodando

Imagine uma cozinha de restaurante no horário de pico. Não é a cozinha da sua casa: são vinte cozinheiros, centenas de pedidos por hora e gente nova entrando na equipe toda semana. Nesse ambiente, uma receita de doze etapas com utensílios exóticos não é sofisticação — é gargalo. O que funciona é receita curta, ferramenta padronizada e qualquer cozinheiro capaz de ler o prato do colega e continuar de onde ele parou.

Em 2007, o Google era essa cozinha. Milhões de linhas de C++ e Java, compilações que levavam perto de uma hora e engenheiros gastando mais tempo decifrando abstrações uns dos outros do que resolvendo problemas. Rob Pike, Robert Griesemer e Ken Thompson — o mesmo Thompson que criou o Unix — decidiram atacar a causa, não o sintoma. A tese deles era desconfortável na época e continua sendo: uma linguagem melhora quando você remove recursos, não quando adiciona. Go nasceu sem herança de classes, sem exceções, sem sobrecarga de operadores e, na maior parte dos casos, com um único jeito óbvio de fazer cada coisa.

O custo dessa decisão é real: você vai escrever um pouco mais de código explícito do que escreveria em Python ou Ruby. O retorno também é real: qualquer pessoa lê qualquer código Go em segundos, o compilador processa projetos gigantes em segundos, e o binário final é um executável único que roda sem instalar runtime, máquina virtual ou dependência de sistema. Docker, Kubernetes, Terraform e Prometheus — a camada de infraestrutura que sustenta a internet moderna — são escritos em Go. No Brasil, é a linguagem por trás de sistemas de pagamento, bancos digitais e plataformas que processam milhões de requisições por dia.

Para quem chega de outra linguagem, duas diferenças aparecem já na primeira semana. Primeiro, Go é compilado e tipado estaticamente: uma classe inteira de erros que você conheceria em produção às três da manhã morre na compilação, antes de o programa existir. Segundo, Go trata concorrência como recurso central da linguagem, não como biblioteca: criar dezenas de milhares de tarefas simultâneas custa poucos megabytes. Você vai chegar lá no módulo de concorrência; por enquanto, basta saber que essa é a razão de tanta infraestrutura crítica escolher Go.

Se o seu dia a dia é JavaScript ou TypeScript, a mudança de postura é esta: não existe undefined is not a function em runtime, porque o compilador rejeita o programa antes. Não existe transpilação, bundler nem node_modules com dezenas de milhares de arquivos — o compilador resolve dependências e gera um binário. E o formato do código não é decidido por ESLint + Prettier + config de time: a ferramenta oficial gofmt formata de um único jeito, para todo mundo. Você perde flexibilidade sintática; ganha o fim das discussões sobre ela.

Este curso segue a mesma filosofia da linguagem: pouca cerimônia, muita prática. Você não vai assistir dez minutos de slides sobre história — vai compilar e rodar Go de verdade nesta página, nos próximos minutos, sem instalar absolutamente nada.

"./01-bem-vindo-ao-go/frames/frame-01.svg", "./01-bem-vindo-ao-go/frames/frame-02.svg", "./01-bem-vindo-ao-go/frames/frame-03.svg", "./01-bem-vindo-ao-go/frames/frame-04.svg" ]} />

Este é o menor programa Go útil que existe, e cada linha dele carrega uma decisão de design da linguagem. Vamos montá-lo peça por peça; no final, o conjunto compila e roda exatamente como está.

Todo arquivo Go começa declarando a qual pacote pertence. Pacote é a unidade de organização de código em Go — pense em um diretório de código com um nome. O nome main é especial: ele avisa ao compilador que este pacote vira um executável, e não uma biblioteca para outros programas importarem.

{/* <!-- chunk:1 --> */}

package main

A cláusula import traz pacotes da biblioteca padrão para dentro do arquivo. fmt — de format — cuida de entrada e saída formatada: imprimir no terminal, montar strings com valores, ler dados. Você vai usá-lo em praticamente todas as aulas. Um detalhe que já mostra a personalidade de Go: importar um pacote e não usar é erro de compilação, não aviso. Código morto não entra.

A introdução termina aqui

Entre para continuar nos slides, rodar o código e enfrentar os desafios.

Começar pela rota →

ESTA ROTA E TODAS AS OUTRAS

Qualquer plano abre os 188 nós.

Mensal R$19,90 · anual R$149 · lifetime R$499. Todos têm garantia de 7 dias.

Comparar os 3 planos →Começar pelas classes grátis