Cómo aprobar una entrevista de Go: las mejores preguntas de la A a la Z
Una entrevista para un puesto de desarrollador Go no es solo una verificación de sintaxis. Los empleadores buscan candidatos que entiendan la filosofía del lenguaje: simplicidad, concurrencia y gestión eficiente de la memoria. En este artículo, analizaremos las preguntas clave que seguramente te harán, desde lo básico hasta temas avanzados con ejemplos de código. Prepárate con nuestra lista de verificación y te sentirás seguro.
1. Fundamentos de Go: tipos de datos, estructuras y gestión de memoria
Empecemos por lo básico. Sin esto no se puede avanzar. A los entrevistadores les encanta hacer preguntas sobre los tipos y su comportamiento.
¿Qué tipos de datos integrados existen en Go?
- Básicos:
int,float64,string,bool. - Agregados:
array,struct. - De referencia:
slice,map,channel,pointer,function.
¿Cuál es la diferencia entre un array y un slice?
Un array tiene una longitud fija, definida en tiempo de compilación. Un slice es una estructura dinámica que hace referencia a un array subyacente.
// Arrayvar arr [3]int = [3]int{1, 2, 3}arr[0] = 10 // Ok
// Sliceslc := []int{1, 2, 3}slc = append(slc, 4) // La longitud puede crecerPregunta trampa: ¿Qué sucede con la memoria al hacer append si se supera la capacidad del slice? (Respuesta: Go asigna un nuevo array del doble de tamaño y copia los datos).
¿Cómo funciona un map en Go?
Un map es una tabla hash. El orden de recorrido no está garantizado. Al leer una clave inexistente, se devuelve el valor cero (por ejemplo, 0 para int).
m := make(map[string]int)m["key"] = 42value, ok := m["key"] // ok == true si la clave existe2. Concurrencia: gorutinas, canales y mutex
Este es el tema más importante para Go. Sin esto no se aprueba la entrevista.
¿Qué es una gorutina y en qué se diferencia de un hilo del SO?
Una gorutina es un hilo ligero gestionado por el runtime de Go. La pila de una gorutina comienza con 2-4 KB (frente a 1 MB de un hilo del SO). Miles de gorutinas se ejecutan en varios hilos del SO (modelo M:N).
¿Cómo funcionan los canales? Dé un ejemplo del patrón 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 tareas for j := 1; j <= 5; j++ { jobs <- j } close(jobs)
// Recogemos los resultados for r := 1; r <= 5; r++ { <-results }}¿Cuál es la diferencia entre un canal con búfer y uno sin búfer?
- Sin búfer: el emisor se bloquea hasta que el receptor recibe el mensaje. Comunicación síncrona.
- Con búfer: el emisor se bloquea solo cuando el búfer está lleno. Comunicación asíncrona.
¿Cómo evitar un deadlock?
Use select con timeout o default:
select {case msg := <-ch: fmt.Println(msg)case <-time.After(1 * time.Second): fmt.Println("timeout")}3. Interfaces, genéricos y manejo de errores
Go no es un lenguaje puramente OOP, pero las interfaces juegan un papel clave aquí.
¿Cómo funciona el tipado pato en Go?
Un tipo implementa una interfaz implícitamente si tiene todos los métodos necesarios. Esto permite escribir código flexible.
type Stringer interface { String() string}
type User struct { Name string}
func (u User) Str