Desafios de entrevista em Go · parte 1 de 11
Desafios de entrevista em Go: índice e como se preparar
intermediárioPublicada em · 7 min de leitura
Este diretório reúne os desafios práticos de código (take-home tests, testes ao vivo e exercícios de pair-programming) mais cobrados por grandes empresas de tecnologia e fintechs de classe mundial para vagas internacionais de Go Developer / Backend Systems Engineer.
Cada desafio foi documentado em sua própria subpasta com a descrição completa da empresa, detalhes e faixas salariais da vaga, regras de negócio formais, exemplos de entrada e saída em JSON, arquitetura recomendada em Go e os critérios de avaliação utilizados pelos avaliadores técnicos.
Tabela comparativa dos desafios
| Empresa | Desafio técnico | Tipo de sistema | Conceitos centrais avaliados | Nota detalhada |
|---|---|---|---|---|
| Nubank | Capital Gains (Ganho de Capital) | CLI / Stream stdin/stdout | Preço Médio Ponderado, regras fiscais, compensação de prejuízo, arquitetura limpa | Nubank - Capital Gains |
| Nubank | Authorizer (Autorizador de Cartão) | Streaming / Validação em Tempo Real | Regras de negócio desacopladas, janela móvel de tempo, detecção de fraude | Nubank - Authorizer |
| Mercado Libre | Mutantes DNA | API REST / Microserviço com DB | Algoritmo $O(N^2)$ com early return, endpoints HTTP, persistência SQL, testes > 80% | Mercado Libre - Mutantes DNA |
| Stone | Financial Transfer & Anti-Deadlock | API Transacional / Core Banking | Prevenção de deadlock em transferências cruzadas, ordenação determinística de travas, idempotência | Stone - Financial Transfer & Deadlock Prevention |
| PicPay | Digital Wallet & Payment Gateway | API REST / Microsserviços | Papéis de carteira (PF vs PJ), autorizador externo mock, resiliência e notificação assíncrona | PicPay - Digital Wallet & Payment Gateway |
| Uber | High-Throughput Rate Limiter | Concorrência / Middleware de Plataforma | Leaky/Token Bucket, multi-tenant por IP, eliminação de vazamento de memória (Janitor) | Uber - High-Throughput Rate Limiter |
| Cloudflare | In-Memory KV Store com TTL | Sistemas / Edge Storage | Particionamento de travas (Lock Sharding), expiração passiva e ativa, pprof | Cloudflare - In-Memory KV Store com TTL |
| Coinbase | Order Book & Matching Engine | Core Trading / Baixa Latência | Prioridade Preço-Tempo (FIFO), listas ligadas duplas, determinação Maker/Taker | Coinbase - Order Book & Matching Engine |
| GitLab | Concurrent Job Queue & Runner Pool | Orquestrador de CI/CD / Plataforma | Limites de concorrência global e por projeto, Fair Scheduling, cancelamento de contexto, Graceful Drain | GitLab - Concurrent Job Queue & Runner Pool |
| Datadog | High-Throughput Metric Aggregator | Daemon de Telemetria / Alta Vazão | Ingestão com 0 allocs/op, rotação atômica de baldes (atomic.Pointer), reciclagem com sync.Pool | Datadog - High-Throughput Metric Aggregator Daemon |
Como se preparar para resolver esses desafios
- Priorize clareza idiomática sobre frameworks pesados: As empresas que contratam para Go valorizam a biblioteca padrão (
net/http,sync,bufio,time,encoding/json). Evite adicionar dezenas de dependências externas para tarefas que Go resolve nativamente. - Execute sempre o detector de condições de corrida:
Qualquer submissão técnica com falhas reportadas pelogo test -race -v ./...-raceé desqualificada sumariamente em empresas como Uber, Cloudflare e Coinbase. - Escreva testes orientados por tabelas (Table-Driven Tests): Teste não apenas os casos felizes, mas especialmente os limites: valores nulos, strings vazias, matrizes mínimas, concorrência extrema e divisões por zero.
- Evite vazamento de recursos e goroutines: Sempre que inicializar um ticker ou goroutine de segundo plano, garanta que ela escute o cancelamento de um canal ou de
context.Contexte chamedefer ticker.Stop().
Navegação e referências internas
- Currículo e Requisitos do Mercado: Curriculo de um Desenvolvedor Go
- Tópicos Técnicos Conectados:
- Concorrência e canais: Goroutine, Channels, sync, waitGroup
- Ciclo de vida e prazos: Context, deadlock, Race Condition
- Performance e memória: Ponteiros, Structs, Profiling
- Comunicação de rede: WebSocket, SQLX, Idempotência
Desafios de algoritmos e estruturas de dados
As tarefas da tabela acima misturam arquitetura, APIs e regras de negócio. Esta seção é outra coisa: problemas curtos de algoritmos e estruturas de dados, do tipo que aparece em entrevistas de código ao vivo e que se resolve em Go com a biblioteca padrão. Eles treinam o raciocínio sobre complexidade de tempo e espaço, que as tarefas grandes exigem mas exercitam pouco.
onde praticar
- LeetCode (https://leetcode.com): o maior banco de problemas de entrevista. Aceita Go em todos os problemas e tem casos de teste públicos e ocultos. Use o filtro por tag (array, hash table, graph, heap) para estudar um assunto de cada vez.
- Exercism, trilha de Go (https://exercism.org/tracks/go): exercícios pequenos com feedback de mentores. Não são problemas de entrevista, mas ensinam o idioma passo a passo e servem de preparação antes do LeetCode.
- Codewars (https://www.codewars.com): desafios de poucas linhas, ordenados por dificuldade (kyu). Bom para treinar sintaxe e manipulação de strings em Go.
- Advent of Code (https://adventofcode.com): um desafio por dia, em dezembro, com entrada diferente para cada pessoa. Como a resposta é um número, dá para comparar a sua solução com a de outras pessoas.
repositórios com soluções em Go
Comparar a sua solução com outra é uma das formas mais rápidas de aprender. Estes repositórios têm código em Go:
- go-dsa (https://pkg.go.dev/github.com/spring1843/go-dsa): mais de cem problemas em quinze tópicos, cada um com explicação da complexidade e testes.
- algorithm-exercises-go (https://awesome.ecosyste.ms/projects/github.com%2Fsir-gon%2Falgorithm-exercises-go): exercícios de algoritmos com testes em Go, desenvolvidos com TDD.
- Advent of Code em Go (https://github.com/dbut2/advent-of-code): soluções de 2020 a 2024, com pacotes reutilizáveis para pilha, fila, lista encadeada e Dijkstra. O autor avisa que há mudanças frequentes, então fixe um commit se for importar o código.
problemas sugeridos
Cada problema treina uma estrutura de dados específica. Dentro de cada grupo, a ordem vai do mais fácil para o mais difícil.
- Two Sum (https://leetcode.com/problems/two-sum/): mapa como índice para achar um par em tempo linear. Em Go,
map[int]intresolve. - Valid Parentheses (https://leetcode.com/problems/valid-parentheses/): pilha. Em Go, um slice com
appende remoção do último elemento faz esse papel. - Merge Intervals (https://leetcode.com/problems/merge-intervals/): ordenação seguida de varredura. Treina
sort.Slice. - Number of Islands (https://leetcode.com/problems/number-of-islands/): percorrer uma matriz com DFS ou BFS. Treina recursão e fila.
- Course Schedule (https://leetcode.com/problems/course-schedule/): grafo dirigido e detecção de ciclo.
- Top K Frequent Elements (https://leetcode.com/problems/top-k-frequent-elements/): mapa de contagem e heap. Treina
container/heap, que exige implementar a interface da fila de prioridade. - Kth Largest Element in a Stream (https://leetcode.com/problems/kth-largest-element-in-a-stream/): min-heap de tamanho fixo.
- LRU Cache (https://leetcode.com/problems/lru-cache/): mapa combinado com lista duplamente encadeada. Em Go, use
container/list. É um dos problemas mais úteis para entender como duas estruturas trabalham juntas. - Trapping Rain Water (https://leetcode.com/problems/trapping-rain-water/): dois ponteiros, sem memória extra.
- Word Search II (https://leetcode.com/problems/word-search-ii/): trie combinada com busca em matriz. É o mais difícil da lista.
roteiro de estudo
- Tente resolver sem olhar a solução por pelo menos 30 minutos. Quem pula essa etapa aprende menos, porque não percebe onde travou.
- Antes de codar, escreva a complexidade esperada em tempo e espaço. Assim você sabe se a solução que escreveu é boa o suficiente.
- Teste os casos de borda: slice vazio, valor zero, números negativos e entradas repetidas.
- Rode
go test -raceem qualquer solução que use goroutines. Em problemas de algoritmos é raro, mas o hábito vale para o trabalho real. - Depois de resolver, leia outra solução em Go e compare. A diferença entre as duas costuma ensinar mais do que a solução em si.