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 | Sí | No | Datos pequeños, sin mutabilidad |
Puntero | No (referencia) | Sí | 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
- Define un struct
User
con camposname
,email
yage
. - Crea dos instancias de
User
: una por valor, otra por puntero. - Modifica un campo desde el puntero y verifica si cambia el original.
- Escribe una función
newUser(name, email string, age int) *User
como constructor. - 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.