Pular para o conteúdo
Hireaan

26 perguntas · Go

Perguntas de entrevista para Desenvolvedor Go

Perguntas para entrevistar desenvolvedores Go: goroutines e channels, interfaces, tratamento idiomático de erros e o modelo de concorrência que faz do Go o que ele é. Para separar quem escreve Go como se fosse Java de quem escreve Go como Go.

Go é uma linguagem pequena de propósito, então entrevistar para Go é menos sobre o quanto a pessoa decorou e mais sobre se ela pensa do jeito Go. O coração da linguagem é a concorrência: goroutines são baratas, channels as coordenam e o mantra da comunidade é "não comunique compartilhando memória; compartilhe memória comunicando". Um bom desenvolvedor Go explica quando usar um channel e quando usar um mutex, como evitar vazamento de goroutines respeitando o cancelamento via context, por que um channel sem buffer bloqueia até os dois lados estarem prontos e como o select multiplexa trabalho concorrente.

Além da concorrência, Go tem um idioma próprio: erros são valores que você verifica explicitamente, não exceções que você lança; interfaces são satisfeitas implicitamente e devem ser pequenas; e simplicidade é recurso, então abstrações espertas costumam ser o instinto errado. Os candidatos que valem a contratação recorrem primeiro à biblioteca padrão, tratam erros de forma deliberada e conhecem as armadilhas sutis, como uma interface nil que não é igual a nil, slices que compartilham o mesmo array por baixo ou uma variável de loop capturada numa goroutine.

Procure também consciência do runtime: o garbage collector, como o scheduler distribui goroutines entre threads do sistema operacional e como usar o pprof quando algo está lento. As perguntas abaixo vão dos fundamentos da linguagem à concorrência, ao tratamento de erros e ao runtime. Combine duas perguntas de fundamentos com um cenário de concorrência e uma conversa sobre "este serviço Go está vazando goroutines", e você vai saber rápido se a pessoa escreve Go idiomático e pronto para produção.

Fundamentos da linguagem7 perguntas

  1. Qual a diferença entre array e slice, e como o array por baixo de um slice causa bugs surpreendentes?

    O que observar: Tamanho fixo versus visão com ponteiro, tamanho e capacidade, e append ou subslices alterando dados compartilhados.

  2. Como funcionam as interfaces em Go e por que a satisfação implícita é diferente de outras linguagens?

    O que observar: Um tipo satisfaz a interface só por ter os métodos, o que permite definir interfaces pequenas no lado de quem consome.

  3. O que é uma interface nil e por que uma interface que guarda um ponteiro nil não é igual a nil?

    O que observar: A interface guarda tipo e valor; com o tipo preenchido ela não é nil, armadilha comum ao retornar erros.

  4. Quando você usa um receiver por ponteiro e quando usa um receiver por valor num método?

    O que observar: Ponteiro para alterar o estado ou evitar cópias grandes, valor para tipos pequenos e imutáveis, e consistência no mesmo tipo.

  5. Qual a diferença entre make e new?

    O que observar: make inicializa slices, maps e channels; new aloca memória zerada e devolve um ponteiro.

  6. Como os maps se comportam e por que a ordem de iteração não é garantida?

    O que observar: Ordem aleatorizada de propósito, maps não são seguros para escrita concorrente e map nil entra em pânico ao receber escrita.

  7. O que faz o defer e em que ordem as chamadas adiadas são executadas?

    O que observar: Executa ao sair da função, em ordem inversa (LIFO), com argumentos avaliados na hora do defer.

Concorrência7 perguntas

  1. O que é uma goroutine e em que ela difere de uma thread do sistema operacional?

    O que observar: Leve, com pilha pequena que cresce, e multiplexada pelo runtime sobre poucas threads do sistema.

  2. Explique a diferença entre channel com buffer e sem buffer e quando você usa cada um.

    O que observar: Sem buffer sincroniza os dois lados; com buffer desacopla até encher, e não deve ser usado para esconder problemas de projeto.

  3. O que "compartilhe memória comunicando" significa na prática?

    O que observar: Passar a posse dos dados por channels em vez de várias goroutines mexerem no mesmo dado com locks.

  4. Quando você usaria um channel e quando usaria um sync.Mutex para proteger estado compartilhado?

    O que observar: Mutex para proteger estado simples, channel para coordenar e passar trabalho, sem dogmatismo.

  5. O que faz o select e como você coloca um timeout na leitura de um channel?

    O que observar: Espera em vários channels ao mesmo tempo, com time.After ou ctx.Done() como caso de timeout.

  6. Como você cancela uma goroutine de forma limpa e qual o papel do context.Context?

    O que observar: Propagar o context, checar ctx.Done() e garantir que toda goroutine tenha um jeito de terminar.

  7. O que é um vazamento de goroutine e como você o detectaria?

    O que observar: Goroutine bloqueada para sempre num channel ou chamada, detectada pela contagem de goroutines e pelo pprof.

Erros e idiomas6 perguntas

  1. Como o Go trata erros e por que a linguagem escolheu valores em vez de exceções?

    O que observar: Erros explícitos no fluxo normal, tratados ou propagados com contexto, e a preferência por clareza ao escrever menos.

  2. Qual a diferença entre embrulhar um erro com %w, errors.Is e errors.As?

    O que observar: %w preserva o erro original, Is compara com um erro sentinela e As extrai um tipo específico da cadeia.

  3. Quando é apropriado usar panic e quando nunca é?

    O que observar: Para erros de programação ou estado impossível na inicialização, nunca para erros esperados como entrada inválida ou falha de rede.

  4. Como é, para você, uma função Go idiomática e legível?

    O que observar: Curta, com retorno antecipado, nomes claros, erro como último retorno e poucos níveis de aninhamento.

  5. Como você organiza um serviço Go que está crescendo para que os pacotes continuem limpos?

    O que observar: Pacotes por domínio, não por camada técnica genérica, uso de internal e evitar dependências circulares.

  6. O que é a interface vazia e por que usá-la com moderação?

    O que observar: any aceita qualquer tipo e joga fora a checagem do compilador; generics ou tipos concretos costumam ser melhores.

Runtime, performance e julgamento6 perguntas

  1. Como funciona o garbage collector do Go em linhas gerais e como você reduz alocações?

    O que observar: Coletor concorrente de marcação e varredura, e técnicas como pré-alocar slices, reaproveitar buffers e checar escape analysis.

  2. Como o scheduler do Go distribui goroutines entre as threads do sistema operacional?

    O que observar: Modelo G-M-P, filas locais com roubo de trabalho e GOMAXPROCS limitando os processadores lógicos.

  3. Como você investigaria um programa Go lento com o pprof?

    O que observar: Perfis de CPU, memória e goroutines, leitura de flame graph e foco no maior consumidor antes de otimizar.

  4. O que é uma data race e como o race detector ajuda a encontrá-la?

    O que observar: Acessos concorrentes sem sincronização com pelo menos uma escrita, e go test -race nos testes e no CI.

  5. Como você escreve um teste orientado a tabela em Go e por que esse idioma é tão popular?

    O que observar: Slice de casos com entrada e saída esperada, t.Run por caso, e facilidade para adicionar cenários.

  6. Conte sobre um bug de concorrência ou problema de performance que você corrigiu num serviço Go.

    O que observar: Detalhes concretos de diagnóstico e correção, e o que a pessoa mudou para prevenir casos parecidos.

Dicas para a entrevista de Desenvolvedor Go

  • Aprofunde em concorrência. Channels, cancelamento e vazamento de goroutines são onde mora a experiência real em Go.
  • Valorize quem escolhe um mutex em vez de um channel quando é mais simples. Go idiomático prefere clareza a esperteza.
  • Observe como a pessoa trata erros. Ignorar erros retornados ou abusar de panic indica hábitos pouco idiomáticos.
  • Pergunte sobre as armadilhas da interface nil e do compartilhamento de slices. Quem as conhece já foi mordido em produção.
  • Valorize a simplicidade. Quem recorre por reflexo a abstrações pesadas ou a generics costuma estar brigando com a linguagem.
  • Peça uma história real de vazamento de goroutine ou de data race. Como a pessoa encontrou o problema diz mais do que qualquer definição.

FAQ

Perguntas frequentes

Quais habilidades um desenvolvedor Go precisa ter?

Domínio real de concorrência (goroutines, channels, select e cancelamento via context), tratamento de erros explícito e idiomático, interfaces pequenas e implícitas e consciência do comportamento do runtime, como o garbage collector e o race detector. Acima de tudo, o instinto de manter o código simples.

Como as perguntas mudam entre Go júnior e sênior?

O júnior escreve um handler que funciona. O sênior raciocina sobre vazamento de goroutines, escolhe entre channel e mutex de forma deliberada, respeita o cancelamento via context, evita as armadilhas de interface nil e de slices e cita bugs de concorrência que corrigiu de verdade.

Concorrência é o mais importante a testar em Go?

É o grande diferencial. A sintaxe do Go se aprende num fim de semana, mas raciocinar corretamente sobre goroutines, channels e cancelamento sob carga é o que separa um desenvolvedor Go pronto para produção.

Vale aplicar um desafio técnico para vagas de Go?

Sim. Um programa concorrente pequeno, como um worker pool com cancelamento ou a correção de um vazamento de goroutine num repositório de exemplo, revela os hábitos reais. Combine o desafio com estas perguntas para avaliar o julgamento.

Como triar candidatos a desenvolvedor Go antes da entrevista?

Use perguntas de triagem na candidatura ou um teste curto de habilidades para filtrar quem entende de verdade concorrência e os idiomas da linguagem antes de gastar tempo de entrevista. Na Hireaan, as perguntas de triagem, os testes de habilidades e o ranking com IA ajudam a ver primeiro os candidatos mais fortes.

Abriu a vaga de Desenvolvedor Go? Rode o processo na Hireaan.

A IA ranqueia os candidatos, você agenda as entrevistas, aplica testes de habilidades e envia a proposta, com um preço fixo para o time inteiro.

  • 14 dias grátis
  • Sem cartão de crédito
  • Cancele quando quiser
  • Conforme a LGPD