Entrevistas de Go focam em goroutines, channels, interfaces e tratamento de erros — a linguagem é pequena, então as perguntas vão fundo em vez de largo. Abaixo estão as mais comuns com respostas modelo. Junior: teoria básica, definições e casos práticos simples.
1
Qual é a diferença entre um array e um slice?
Resposta
Um array tem um comprimento fixo que faz parte do seu tipo — [3]int e [4]int são tipos diferentes. Um slice é uma visão sobre um array: um ponteiro, um comprimento e uma capacidade. Você vai usar slices para quase tudo; arrays aparecem principalmente como o storage subjacente que você nunca nomeia.
2
O que acontece quando você dá append num slice passando da sua capacidade?
Resposta
O Go aloca um novo array subjacente maior, copia os elementos e retorna um slice apontando para o novo. O slice antigo continua apontando para o array antigo — por isso o append retorna um valor que você precisa atribuir. Ignorar o retorno é o bug clássico de iniciante, e funciona até a capacidade estourar.
3
O que é o zero value, e por que o Go tem um?
Resposta
Todo tipo tem um valor zero utilizável: 0 para números, "" para strings, nil para ponteiros, maps e slices. Isso significa que uma variável declarada sempre está inicializada, então não há estado indefinido para ler por acidente. A consequência prática é que um struct com zero values sensatos muitas vezes não precisa de construtor.
4
Qual é a diferença entre um value receiver e um pointer receiver?
Resposta
Um value receiver recebe uma cópia, então mutações não sobrevivem à chamada; um pointer receiver opera sobre o original. Use um ponteiro quando o método muta, ou quando o struct é grande o bastante para que copiá-lo custe caro. Misturar os dois num tipo é onde as pessoas se confundem, porque o method set de T e *T então divergem.
5
Como funciona o tratamento de erros, e por que não existem exceções?
Resposta
Erros são valores comuns retornados junto ao resultado e checados no call site. É verboso de propósito: o caminho onde algo falha fica visível no código em vez de escondido num stack unwind. panic existe para situações genuinamente irrecuperáveis, e usá-lo para controle de fluxo é um code smell que qualquer revisor vai apontar.
6
O que é uma goroutine, e como ela se diferencia de uma thread?
Resposta
Uma goroutine é uma função escalonada pelo runtime do Go em vez do sistema operacional. Ela começa em poucos kilobytes e cresce, então centenas de milhares delas são algo comum, quando a mesma quantidade de threads do SO não seria. O runtime as multiplexa sobre um pool pequeno de threads reais.
7
O que o `defer` faz, e quando roda?
Resposta
Agenda uma chamada para quando a função ao redor retorna, de qualquer forma que ela retorne. Isso o torna o lugar certo para fechar um arquivo ou liberar um mutex, logo ao lado da linha que o abriu ou travou. Os argumentos são avaliados no statement defer, não na execução — o que surpreende quem adia algo usando uma variável de loop.