Trilha prática · Go
Regras de negócio que não dependem do banco, do framework ou do protocolo.
Em progresso11/31 aulas
Aprenda Clean Architecture e Go ao mesmo tempo, evoluindo um único projeto real — aprovador-pedidos — camada por camada: domínio, casos de uso, interfaces e infraestrutura.
Comece aqui
Aulas
- Abrir aula
Aula 01 · 70–90 minutos
O que é Clean Architecture, e por quê
Aula 1 — Injeção de Dependência, o Dependency Inversion Principle, a Regra de Dependência, as quatro camadas, e a comparação com MVC/Active Record.
- Abrir aula
Aula 02 · 50–70 minutos
Interfaces em Go
Aula 2 — satisfação implícita, a convenção de onde declarar a interface, por que isso facilita testes, e a pegadinha do nil.
Como estudar esta trilha
31 aulas, um projeto só, evoluindo camada por camada
Cada aula parte de um problema concreto que já existe no projeto aprovador-pedidos — nunca de um exemplo abstrato solto. A ordem é deliberada: teoria (Regra de Dependência, DIP) antes da sintaxe de Go, sintaxe antes do primeiro projeto real, e cada camada nova (domínio, aplicação, infraestrutura, interface) só entra depois que a anterior está sólida. Aulas publicadas são clicáveis; as demais mostram a sequência planejada.
01 · Fundamentos
Entender por que a dependência aponta para dentro
Injeção de Dependência, Dependency Inversion Principle, a Regra de Dependência e as quatro camadas — antes de qualquer linha de Go.
- Módulos e pacotes em Go45–60 minutos · Aula 3 — go.mod, a relação entre diretório e pacote, caminhos de import, o diretório internal, e o que Go não dita sobre estrutura de pastas.
- Primeiro projeto Go real60–75 minutos · Aula 4 — construindo aprovador-pedidos do zero: domain puro, use case que declara a interface, fake para teste, implementação em memória e injeção manual em main.go.
- Screaming Architecture: o que a árvore de pastas deveria gritar50–70 minutos · Aula 5 — por que a estrutura de pastas de um projeto deveria comunicar o negócio, não o framework; aplicando a lente ao aprovador-pedidos e ao anti-padrão do pacote models genérico.
02 · Domínio
Dar estado e comportamento ao domínio
Um terceiro caso de uso revela que o domínio nunca teve estado explícito; Domain Events nomeia uma decisão que os casos de uso já tomavam silenciosamente.
- Um terceiro use case: rejeitar, e o estado que faltava50–70 minutos · Aula 6 — por que um bool não basta para representar o status de um pedido, o anti-padrão de dois bools independentes, e o tipo StatusPedido que torna o estado impossível irrepresentável.
- Domain Events: nomeando uma decisão que Executar já tomava escondida50–70 minutos · Aula 7 — por que uma decisão de negócio desaparecia ao virar só um novo valor de Status; o padrão Domain Event de Martin Fowler, os tipos PedidoAprovado e PedidoRejeitado, e main.go voltando a ser quem observa o que o domínio produziu.
03 · Aplicação
Modelar casos de uso e fronteiras
Um segundo caso de uso, DTOs nas fronteiras e a nomenclatura de Interactor/Input Boundary/Output Boundary de Uncle Bob comparada à do projeto.
- Um segundo use case: consultar pedido45–65 minutos · Aula 8 — o sistema só sabia escrever, nunca ler de volta; por que engordar PedidoRepository com Buscar viola o Interface Segregation Principle, e como PedidoFinder, uma interface pequena e separada, resolve isso.
- DTOs: o bug que Executar(domain.Pedido) escondia, e o padrão que já existia na Lição 455–75 minutos · Aula 9 — um bug real em AprovarPedido.Executar causado por receber domain.Pedido inteiro como parâmetro; a definição de DTO de Martin Fowler, seu próprio aviso contra usá-los sem necessidade, e o Input que corrige o bug sem contradizer esse aviso.
- Input Ports: a nomenclatura de Uncle Bob vs. a do projeto50–70 minutos · Aula 10 — nove aulas construindo Clean Architecture sem usar o vocabulário formal de Robert C. Martin (Interactor, Input/Output Boundary, Request/Response Model); o vocabulário irmão da Arquitetura Hexagonal (Port); e a peça que este projeto, de propósito, ainda não tem.
04 · Infraestrutura e persistência
Trocar detalhes sem tocar na regra
Banco de dados real, transações, configuração via variáveis de ambiente e um cliente de API externa — tudo isolado atrás de portas já definidas.
- Repositório real com banco de dados60–80 minutos · Aula 11 — memoria.PedidoRepository se aposenta; postgres.PedidoRepository entra em cena com pgx, ON CONFLICT DO UPDATE, e uma armadilha real do Go idiomático que violaria a Regra de Dependência se não fosse evitada de propósito.
- Transações: duas escritas que precisam ser uma sóEm breve
- Configuração e variáveis de ambienteEm breve
- Integrando um cliente de API externa: score de crédito antes de aprovarEm breve
05 · Interface
Conectar o mundo externo ao caso de uso
Adapter HTTP, o roteador nativo do Go 1.22+, recuperação de panic e a diferença entre Presenter e DTO simples.
- Adapter HTTP para o caso de usoEm breve
- O roteador nativo do Go 1.22+Em breve
- panic e recover: o servidor não pode cair por um erro imprevistoEm breve
- Presenters e ViewModels: formatar não é decidirEm breve
06 · Testes e qualidade
Provar a regra, não só executá-la
Cross-cutting concerns via decorator, concorrência com goroutines e channels, testes tabulares e o ferramental que o time nunca discute.
- Cross-cutting concerns: logging sem sujar o use caseEm breve
- Goroutines e channels: consultando vários pedidos em paraleloEm breve
- Table-driven tests: um teste, muitos casosEm breve
- gofmt, go vet e linters: o time nunca discute chavesEm breve
- Conformidade arquitetural automatizadaEm breve
07 · Refatoração e evolução
Mudar um sistema vivo com risco controlado
SOLID e generics no projeto real, cancelamento com context, worker pools, coesão e acoplamento de componentes, evolução de contrato e CI/CD.
- SOLID no projeto real: S, O, L, IEm breve
- Generics: um decorator que serve para os três use casesEm breve
- context.Context: cancelamento atravessando as camadasEm breve
- Worker pool: limitando quantas goroutines rodam ao mesmo tempoEm breve
- Coesão e acoplamento de componentes: SOLID um nível acimaEm breve
- Evoluindo um use case sem quebrar contratoEm breve
- Extração de monolito modular: quando um pacote vira um móduloEm breve
- Consistência arquitetural em CI/CDEm breve
Para consultar