Como passar em uma entrevista de Go: principais perguntas de A a Z
A entrevista para a posição de desenvolvedor Go não é apenas uma verificação de sintaxe. Os empregadores procuram candidatos que entendam a filosofia da linguagem: simplicidade, concorrência e gerenciamento eficiente de memória. Neste artigo, vamos analisar as principais perguntas que você certamente receberá — desde o básico até tópicos avançados com exemplos de código. Prepare-se com nossa lista de verificação e você se sentirá confiante.
1. Fundamentos do Go: tipos de dados, estruturas e gerenciamento de memória
Vamos começar com o básico. Sem ele, não há como ir adiante. Os entrevistadores adoram fazer perguntas sobre tipos e seus comportamentos.
Quais são os tipos de dados embutidos em Go?
- Básicos:
int,float64,string,bool. - Agregados:
array,struct. - Referência:
slice,map,channel,pointer,function.
Qual a diferença entre array e slice?
O array tem um tamanho fixo, definido em tempo de compilação. O slice é uma estrutura dinâmica que faz referência a um array subjacente.
// Arrayvar arr [3]int = [3]int{1, 2, 3}arr[0] = 10 // Ok
// Sliceslc := []int{1, 2, 3}slc = append(slc, 4) // O tamanho pode crescerPergunta capciosa: O que acontece com a memória durante append, se a capacidade do slice for excedida? (Resposta: Go aloca um novo array 2 vezes maior e copia os dados).
Como funciona um map em Go?
Map é uma tabela hash. A ordem de iteração não é garantida. Ao ler uma chave inexistente, retorna o valor zero (por exemplo, 0 para int).
m := make(map[string]int)m["chave"] = 42valor, ok := m["chave"] // ok == true, se a chave existir2. Concorrência: goroutines, canais e mutexes
Este é o tópico mais importante para Go. Sem ele, você não passa na entrevista.
O que é uma goroutine e qual a diferença para uma thread do SO?
Uma goroutine é uma thread leve, gerenciada pelo runtime do Go. A pilha da goroutine começa com 2-4 KB (contra 1 MB de uma thread do SO). Milhares de goroutines rodam em algumas threads do SO (modelo M:N).
Como funcionam os canais? Dê um exemplo do padrão worker pool.
func worker(id int, jobs <-chan int, results chan<- int) { for j := range jobs { results <- j * 2 }}
func main() { jobs := make(chan int, 100) results := make(chan int, 100)
// Iniciamos 3 workers for w := 1; w <= 3; w++ { go worker(w, jobs, results) }
// Enviamos tarefas for j := 1; j <= 5; j++ { jobs <- j } close(jobs)
// Coletamos os resultados for r := 1; r <= 5; r++ { <-results }}Qual a diferença entre um canal bufferizado e não bufferizado?
- Não bufferizado: o remetente bloqueia até que o destinatário receba a mensagem. Comunicação síncrona.
- Bufferizado: o remetente bloqueia apenas quando o buffer está cheio. Comunicação assíncrona.
Como evitar deadlock?
Use select com timeout ou default:
select {case msg := <-ch: fmt.Println(msg)case <-time.After(1 * time.Second): fmt.Println("timeout")}3. Interfaces, genéricos e tratamento de erros
Go não é uma linguagem puramente OOP, mas as interfaces desempenham um papel fundamental aqui.
Como funciona a tipagem pato (duck typing) em Go?
Um tipo implementa uma interface implicitamente se tiver todos os métodos necessários. Isso permite escrever código flexível.
type Stringer interface { String() string}
type User struct { Name string}
func (u User) Str