11 Structs

Published Apr 24, 2023

GoProgrammingStructs

🧠 Introducción

Los structs (estructuras) en Go te permiten agrupar datos relacionados en una única unidad lógica. Son esenciales para modelar entidades reales, como usuarios, productos, puntos en el espacio, etc.

1. 🔍 ¿Qué es un Struct?

Un struct es una colección de campos con distintos tipos de datos. Se define con la palabra clave type.

✅ Ejemplo básico:

type Point struct {
    x float32
    y float32
    z float32
}

func main() {
    var pt1 Point
    pt1.x = 3.1
    pt1.y = 5.7
    pt1.z = 4.2
    fmt.Println(pt1) // {3.1 5.7 4.2}
}

2. ✍️ Formas de inicializar un struct

A. Inicialización explícita:

pt := Point{x: 5.6, y: 3.8, z: 6.9}

B. Inicialización implícita (orden exacto de campos):

pt := Point{5.6, 3.8, 6.9}

⚠️ Mejor evitar esta forma si hay muchos campos, ya que puede volverse confusa.

C. Inicialización multilínea:

pt := Point{
    x: 5.6,
    y: 3.8,
    z: 6.9, // Coma al final
}

3. 🏗️ Constructor functions

Go no tiene constructores automáticos como otros lenguajes. Se usa una función que devuelve un puntero al struct.

func newPoint(x, y, z float32) *Point {
    p := Point{x: x, y: y, z: z}
    return &p
}
pt := newPoint(7.8, 9.1, 2.3)
fmt.Println(pt) // &{7.8 9.1 2.3}

4. 🧠 Punteros vs Copias

A. Punteros: comparten datos

pt1 := newPoint(7.8, 9.1, 2.3)
pt2 := pt1
pt2.x = 99.9

fmt.Println(pt1) // &{99.9 9.1 2.3}
fmt.Println(pt2) // &{99.9 9.1 2.3}

B. Copias: datos independientes

pt1 := Point{x: 7.8, y: 9.1, z: 2.3}
pt2 := pt1
pt2.x = 99.9

fmt.Println(pt1) // {7.8 9.1 2.3}
fmt.Println(pt2) // {99.9 9.1 2.3}

5. 📦 Punteros vs Valores

Forma ¿Copia? ¿Modifica original? ¿Uso recomendado?
Valor No Datos pequeños, sin mutabilidad
Puntero No (referencia) Datos grandes, necesita mutación

Ejemplo visual:

pt1 := &Point{x: 1.1, y: 2.2, z: 3.3} // puntero
pt2 := Point{x: 4.4, y: 5.5, z: 6.6}  // copia por valor

fmt.Println(pt1) // &{1.1 2.2 3.3}
fmt.Println(pt2) // {4.4 5.5 6.6}

✅ Conclusión

  • Los structs permiten definir tus propios tipos de datos combinando varios campos.
  • Se pueden inicializar de distintas formas: explícita, implícita o por constructor.
  • Los punteros permiten trabajar directamente con memoria y modificar el struct original.
  • Las copias por valor son independientes: modificar una no afecta a la otra.

Los structs son esenciales para estructurar programas más grandes y legibles.

🛠️ Práctica recomendada

  1. Define un struct User con campos name, email y age.
  2. Crea dos instancias de User: una por valor, otra por puntero.
  3. Modifica un campo desde el puntero y verifica si cambia el original.
  4. Escribe una función newUser(name, email string, age int) *User como constructor.
  5. Imprime usuarios usando fmt.Printf() y acceso a campos.

🚀 Siguientes pasos

Ahora que ya entiendes cómo crear y usar structs, es momento de aprender:

  • 🔧 Métodos en structs: cómo agregar funciones asociadas a tus tipos personalizados.
  • 👥 Composición de structs: cómo un struct puede contener otro.
  • 🔄 Interfaces: cómo usar structs en programación orientada a comportamiento.