Middle Go Backend — Preguntas de entrevista Golang
Middle · 2–4 años de experiencia
Las entrevistas de Go se enfocan en goroutines, channels, interfaces, y manejo de errores — el lenguaje es pequeño, así que las preguntas van a fondo en vez de ir a lo ancho. Aquí están las más comunes con respuestas modelo. Middle: comprensión más profunda, optimización y situaciones reales de trabajo.
Pruébalo — sin cuenta necesaria
Preparando tu pregunta…
Temas para prepararte
✓Goroutines y el scheduler
✓Channels y select
✓Interfaces y composición
✓Manejo de errores
✓Slices y maps
✓Context y cancelación
7 preguntas de nivel Middle con respuestas
1
¿Cuál es la diferencia entre un channel con buffer y uno sin buffer?
Respuesta
Un channel sin buffer sincroniza: el envío se bloquea hasta que un receptor toma el valor, así que ambos lados se encuentran. Un channel con buffer acepta hasta su capacidad sin un receptor, y se bloquea solo cuando está lleno. Sin buffer es el default más seguro porque hace el handoff explícito; un buffer es una decisión sobre cuánto trabajo puede acumularse.
2
¿Cuándo se filtra una goroutine, y cómo lo notarías?
Respuesta
Cuando se bloquea para siempre en un channel que nadie va a leer o escribir, o espera en un context que nunca se cancela. Lo notas por un conteo de goroutines que sube y nunca baja — runtime.NumGoroutine() o el perfil de goroutines de pprof, que muestra exactamente dónde están aparcadas. La causa usual es un productor que retorna temprano y deja a un consumidor esperando.
3
¿Para qué es `context`?
Respuesta
Llevar un deadline, una señal de cancelación y valores con alcance de request a través de los límites de la API. Su trabajo real es la cancelación: cuando se abandona un request, todo lo que empezó debería parar en vez de seguir trabajando para nadie. La regla que lo mantiene útil es que context es el primer parámetro y nunca se guarda en un struct.
4
¿Cómo se comporta un `select` con `default` diferente de uno sin?
Respuesta
Sin default, select se bloquea hasta que uno de sus cases esté listo. Con default, toma el default inmediatamente si nada más lo está, haciendo la operación no bloqueante. Un default dentro de un loop sin ningún otro bloqueo es un busy-wait que hará girar un core, que es el error a vigilar.
5
¿Qué encuentra el race detector, y qué no?
Respuesta
Encuentra acceso concurrente a la misma memoria donde al menos uno es una escritura, en los caminos de código realmente ejecutados durante la corrida. Lo que no encuentra es la race que no ejercitaste — es una herramienta de runtime, no una prueba. Por eso pertenece al CI contra tests reales en vez de correrse una vez a mano.
6
¿Cómo decides entre un mutex y un channel?
Respuesta
Un mutex protege estado compartido; un channel transfiere la propiedad de datos. Si varias goroutines leen y escriben una estructura, un mutex es más simple y rápido. Si el trabajo se mueve de una goroutine a otra, un channel expresa eso directamente. Recurrir a un channel para proteger un contador es una sobrecomplicación común.
7
¿Qué garantiza `sync.WaitGroup`, y cómo se usa mal?
Respuesta
Que Wait retorna una vez que el contador llega a cero, así que sabes que cada goroutine rastreada terminó. Los dos usos incorrectos clásicos son llamar a Add dentro de la goroutine, lo que hace race con Wait, y pasar el WaitGroup por valor, lo que lo copia y deja el contador original intacto. Ambos compilan y ambos fallan intermitentemente.
🦎
Leer respuestas no es suficiente
En una entrevista real hablas bajo presión. Cam hace estas mismas preguntas, evalúa cada respuesta y muestra exactamente qué mejorar.