Este ejercicio de evaluación está diseñado para medir tus conocimientos en Go y su ecosistema. Para rendir satisfactoriamente esta evaluación, es necesario que tengas un entendimiento sólido de los siguientes temas:
Temas a evaluar
Introducción a Go
- Historia y filosofía de Go
- Usos de Go en la actualidad
- Comparativa de Go con otros lenguajes de programación
Instalación y primer programa de Go
- Estructura básica de un programa Go
- Compilación y ejecución
- El paquete
main
y la funciónmain
- Paquetes e importaciones
Tipos de datos, variables y constantes
- Declaración y asignación de variables
- Tipos de datos primitivos: enteros, flotantes, booleanos, cadenas
- Uso de constantes con la palabra clave
const
Operadores y expresiones
- Operadores aritméticos, lógicos y relacionales
- Precedencia y asociatividad de operadores
- Conversión y casting de tipos
Cadenas de texto y manipulación
- Operaciones básicas con cadenas
- Uso del paquete
strings
- Formateo y construcción de cadenas con
fmt
Estructuras de control
- Sentencias
if
,else if
,else
- Uso de
switch
ycase
Control de flujo y estructuras de bucle
- Uso del bucle
for
en sus distintas formas - Iteración sobre colecciones con
range
- Control de bucles con
break
ycontinue
Funciones
- Definición y llamada de funciones
- Parámetros, argumentos y valores de retorno
- Valores de retorno múltiples y nombrados
Arrays y slices
- Declaración y uso de arrays
- Introducción y manejo de slices
- Operaciones comunes: agregar, copiar, segmentar
Mapas
- Creación y manipulación de mapas
- Acceso y modificación de elementos
- Detección de claves y eliminación de pares
Punteros y referencias
- Concepto de punteros en Go
- Operadores
&
(dirección) y*
(indirección) - Punteros a tipos y seguridad de memoria
Estructuras (structs)
- Definición y uso de structs
- Campos anónimos y composición
- Comparación con clases en otros lenguajes
Métodos con receptores por valor y por puntero
- Asociar métodos a tipos definidos
- Receptores por valor
- Receptores por puntero
- Encapsulación y acceso a datos
- Modificación de estado en métodos
Polimorfismo a través de Interfaces
- Cómo definir e implementar interfaces en Go
- Polimorfismo basado en interfaces y cómo usarlo en lugar de herencia
- Uso de interfaces vacías (
interface{}
) y su aplicación
Composición de structs en lugar de herencia
- Incrustación de structs y cómo se logra la reutilización de código
- Ejemplos de composición vs herencia clásica
- Cómo la composición promueve la flexibilidad y evita problemas comunes de la herencia
Generics
- Cómo definir funciones y tipos genéricos
- Restricciones de tipos mediante
type constraints
- Ejemplos de uso de genéricos en estructuras de datos y funciones comunes
Manejo explícito de errores
- Retorno de tipo
error
en funciones - Propagación de errores
- Evitar el manejo de errores silencioso
Errores personalizados y wrapping para mejorar la trazabilidad
- Creación de errores personalizados
- Cómo envolver errores con
fmt.Errorf
- Uso de
errors.Is
yerrors.As
para desempaquetar y analizar errores complejos - Casos prácticos: cuándo y cómo aplicar wrapping de errores para depuración efectiva
Métodos HTTP con net/http
- Realizar peticiones HTTP GET
- Realizar peticiones HTTP POST
- Realizar peticiones HTTP PUT y PATCH
- Realizar peticiones HTTP DELETE
API REST con net/http
- Configurar un API REST JSON sin framework
- Recibir peticiones GET
- Recibir peticiones POST
- Realizar peticiones HTTP PUT y PATCH
- Realizar peticiones HTTP DELETE
Goroutines y concurrencia básica
- Cómo crear y manejar Goroutines
- Uso de WaitGroups para gestionar ciclos de vida de las Goroutines
- Ejemplos de ejecución concurrente utilizando Goroutines
Canales y comunicación entre Goroutines
- Creación y uso de canales (unbuffered y buffered)
- Cómo enviar y recibir datos entre Goroutines
- Patrones comunes como el modelo productor-consumidor y Fan-in/Fan-out
Condiciones de carrera
- Qué es una condición de carrera
- Cómo detectar condiciones de carrera
- Cómo solucionar condiciones de carrera
Selectores y Mutexes: Concurrencia y Exclusión Mutua
- Uso del
select
para gestionar múltiples canales simultáneamente - Uso de
mutexes
para sincronización y evitar condiciones de carrera - Ejemplos de patrones concurrentes con selectores y protección de datos compartidos con mutexes

Alan Sastre
Ingeniero de Software y formador, CEO en CertiDevs
Ingeniero de software especializado en Full Stack y en Inteligencia Artificial. Como CEO de CertiDevs, Go es una de sus áreas de expertise. Con más de 15 años programando, 6K seguidores en LinkedIn y experiencia como formador, Alan se dedica a crear contenido educativo de calidad para desarrolladores de todos los niveles.
Más tutoriales de Go
Explora más contenido relacionado con Go y continúa aprendiendo con nuestros tutoriales gratuitos.
Aprendizajes de esta lección
- Comprender la historia y filosofía de Go.
- Manejar la sintaxis y estructura básica de programas en Go.
- Utilizar tipos de datos, variables, constantes y operadores.
- Manipular cadenas de texto y formatear salidas.
- Implementar estructuras de control y bucles.
- Definir y usar funciones con parámetros y retornos múltiples.
- Trabajar con arrays, slices y mapas.
- Entender y aplicar punteros y referencias.
- Crear structs y métodos asociados.
- Implementar interfaces y aplicar polimorfismo.
- Usar generics para funciones y tipos genéricos.
- Manejar errores de forma explícita y crear errores personalizados.
- Desarrollar aplicaciones HTTP utilizando el paquete
net/http
. - Implementar concurrencia con goroutines y canales.
- Detectar y resolver condiciones de carrera.
- Sincronizar código concurrente utilizando selectores y mutexes.