1. Fundamentos de Go (120 preguntas)
Sintaxis y semántica (30 preguntas)
1. ¿Cuál es el valor cero de un mapa en Go?
Por qué:
Comprender los valores cero evita problemas de ejecución causados por mapas no inicializados.
Qué:
- El valor cero de un mapa es
nil. - Un mapa nulo no puede contener pares clave-valor.
Cómo:
var m map[string]int // m == nil
m = make(map[string]int) // inicializar
m["age"] = 30 // ahora funciona
Caso de uso en la vida real:
Un mapa nulo podría representar un objeto de configuración sin inicializar. Una inicialización correcta evita fallos al agregar configuraciones.
2. ¿Cómo maneja Go la conversión de tipo implícita entre int y float64?
Por qué:
Go aplica una tipificación estricta para evitar la pérdida accidental de datos.
Qué:
- No hay conversión implícita entre tipos numéricos.
- Se requiere casting explícito.
Cómo:
i := 42
f := float64(i) // conversión explícita
i = int(f) // volver a int (trunca el decimal)
Caso de uso en la vida real:
Conversión de lecturas de sensores (enteros) a valores de punto flotante para cálculos científicos.
3. Escribe el código para declarar constantes para los días de la semana usando iota.
Por qué:
iota simplifica las declaraciones de constantes secuenciales.
Qué:
- iota se incrementa automáticamente desde 0 en un bloque de constantes.
Cómo:
const(
Sunday = iota // 0
Monday // 1
Tuesday // 2
// ... hasta Saturday (6))
Caso de uso en la vida real:
Representar días en sistemas de programación (por ejemplo, aplicaciones de calendario).
4. Explica la diferencia entre var x int = 10 y x := 10.
Por qué:
Elegir el estilo de declaración correcto afecta la legibilidad y el alcance del código.
Qué:
- var x int = 10: Declaración de tipo explícita, funciona en cualquier ámbito.
- x := 10: Inferencia de tipos, solo dentro de funciones.
Cómo:
varglobalVar int = 10 // nivel de paquete
funcmain(){
localVar := 20 // nivel de función
}
Caso de uso en la vida real:
Usando var para constantes a nivel de paquete y := para variables de bucle local.
5. ¿Por qué Go no permite variables o importaciones no utilizadas?
Por qué:
Go prioriza el código limpio y eficiente y la seguridad en tiempo de compilación.
Qué:
- Las variables/importaciones no utilizadas indican posibles errores o inflación.
- El compilador lanza errores para forzar la limpieza.
Cómo:
// Error: unused import "fmt"
// Error: unused variable x
import"fmt"
func main() {
x := 10
}
Caso de uso en la vida real:
Evitar que las variables de depuración sobrantes se envíen a producción.
6. ¿Cómo se crea una cadena de varias líneas sin caracteres de escape?
Por qué:
Las cadenas sin formato mejoran la legibilidad de las plantillas o JSON.
Qué:
- Utilice comillas invertidas ` para literales de cadena sin formato.
Cómo:
s :=`Line 1
Line 2
Line 3`
Caso de uso en la vida real:
Incrustar consultas SQL o plantillas HTML en el código.
7. ¿Cuál es el propósito del _ (identificador en blanco) en los bucles for?
Por qué:
Ignora los valores que no necesitas, evitando las advertencias del compilador.
Qué:
- Omite el índice o valor en bucles de rango.
Cómo:
for _, value := range []int{1,2,3} {
fmt.Println(value) // ignorar indice
}
Caso de uso en la vida real:
Procesamiento de elementos de slices sin necesidad de conocer sus posiciones.
8. ¿Cómo maneja Go el desbordamiento de int8?
Por qué:
El manejo de desbordamientos afecta la integridad de los datos en sistemas de bajo nivel.
Qué:
- Se envuelve usando aritmética de complemento a dos.
Cómo:
var a int8 = 127
a++ // -128 (desbordamiento)
Caso de uso en la vida real:
Manejo de datos de sensores que exceden los límites del hardware.
9. ¿Cuál es la salida de fmt.Printf("%T", 'a')?
Por qué:
Comprender el tipo de runa de Go es clave para el manejo de Unicode.
Qué:
- 'a' es una runa (alias para int32).
Cómo:
fmt.Printf("%T",'a') // salida: int32
Caso de uso en la vida real:
Procesamiento de texto multilingüe (por ejemplo, emojis en la entrada del usuario).
10. ¿Cómo se define un alias de tipo personalizado para int?
Por qué:
Los alias de tipo mejoran la claridad del código y evitan el uso indebido.
Qué:
- Utilizar type NewName ExistingType.
Cómo:
type UserID int
var id UserID =1001
Caso de uso en la vida real:
Distinguir los identificadores de bases de datos de los números enteros regulares.