Structs para Lista de Tareas

Clase 12 de 42Curso Práctico de Go: Creación de un Servidor Web

Contenido del curso

Construyendo un Servidor Web

Resumen

Construir una lista de tareas en Go permite comprender cómo funcionan los structs con propiedades internas, cómo se crean receiver functions para modificar esos datos y por qué los cambios pueden no reflejarse como esperas. Este ejercicio práctico sienta las bases para proyectos más complejos y revela un comportamiento fundamental del lenguaje relacionado con las referencias y copias de valores.

¿Cómo se define un struct con múltiples propiedades en Go?

Un struct en Go puede contener varias propiedades tipadas. En este caso se crea un struct llamado task con tres campos [01:20]:

go type task struct { nombre string descripcion string completado bool }

  • nombre y descripcion son de tipo string.
  • completado usa el tipo bool, un booleano que solo admite true o false.

Para instanciar este struct hay que asignar cada propiedad usando la sintaxis llave: valor [02:10]:

go t := task{ nombre: "Completar mi curso de Go", descripcion: "Completar mi curso de Go de Platzi en esta semana", }

Un detalle que Go exige es colocar una coma al final de la última propiedad, incluso si no hay nada después. Omitirla genera un error de compilación [03:50].

¿Qué hace fmt.Printf y el formato %+v?

Cuando se imprime un struct con fmt.Println, la salida es poco legible porque solo muestra los valores sin indicar a qué propiedad pertenecen. Para resolver esto se utiliza fmt.Printf con el verbo de formato %+v [04:30]:

go fmt.Printf("%+v\n", t)

  • %+v imprime cada propiedad junto con su valor.
  • \n agrega un salto de línea para que la salida no quede pegada a la siguiente impresión.

El resultado muestra algo como {nombre:Completar mi curso de Go descripcion:Completar mi curso de Go de Platzi en esta semana completado:false}, lo cual facilita la depuración.

¿Cómo se crean receiver functions para modificar un struct?

Las receiver functions son métodos asociados a un struct que permiten operar sobre sus propiedades. Se definen tres funciones para la lista de tareas [05:40]:

go func (t task) marcarCompleta() { t.completado = true }

func (t task) actualizarDescripcion(descripcion string) { t.descripcion = descripcion }

func (t task) actualizarNombre(nombre string) { t.nombre = nombre }

  • marcarCompleta no recibe parámetros ni retorna valores; solo cambia completado a true.
  • actualizarDescripcion y actualizarNombre reciben un parámetro string con el nuevo valor.
  • Ninguna de las tres funciones necesita retornar datos porque la intención es modificar el estado interno del struct.

¿Por qué los cambios no se reflejan después de llamar las funciones?

Al ejecutar las tres funciones y volver a imprimir el struct, el resultado es idéntico al original [08:20]:

go t.marcarCompleta() t.actualizarNombre("Finalizar mi curso de Go") t.actualizarDescripcion("Completar mi curso cuanto antes") fmt.Printf("%+v\n", t)

La salida antes y después de las llamadas es exactamente la misma. Esto ocurre porque Go envía una copia del struct a cada receiver function, no una referencia al original. Los cambios se aplican sobre la copia y se pierden cuando la función termina. Este comportamiento está ligado a cómo Go maneja las referencias y los punteros, un tema que se aborda en la siguiente sesión.

¿Qué pasa cuando hay dos funciones main en el mismo paquete?

Durante el desarrollo aparece un error porque tanto calculadora.go como tareas.go declaran package main con su propia función main. En Go, un paquete solo puede tener una función main [03:15]. La solución temporal es ejecutar únicamente el archivo deseado:

bash go run tareas.go

Esto hace que el compilador ignore el otro archivo. Más adelante, el uso de módulos en Go permite organizar el código en paquetes separados y resolver esta limitación de forma estructurada.

Si ya te topaste con el problema de que tus receiver functions no actualizan el struct, comparte en los comentarios cómo crees que se resuelve antes de pasar a la siguiente clase.