Una estructura en Go es un tipo de dato compuesto que agrupa variables bajo un mismo nombre. Cada variable en una estructura se llama campo. Las estructuras son útiles para modelar datos que tienen múltiples atributos. Por ejemplo, para representar un punto en un plano cartesiano, podríamos usar una estructura que contenga coordenadas x
e y
.
Para definir una estructura en Go, se utiliza la palabra clave type
seguida del nombre de la estructura y la palabra clave struct
. A continuación, se definen los campos que componen la estructura. Aquí un ejemplo sencillo:
type Point struct {
X int
Y int
}
En este ejemplo, Point
es una estructura con dos campos: X
e Y
, ambos de tipo int
.
Existen varias maneras de crear e inicializar estructuras en Go:
Puedes declarar una estructura especificando valores para cada uno de sus campos:
p1 := Point{X: 10, Y: 20}
Otra manera es declarar los valores en el orden en que están definidos los campos en la estructura:
p2 := Point{10, 20}
También puedes declarar una estructura sin inicializar sus campos, en cuyo caso tomarán los valores por defecto de sus tipos:
p3 := Point{}
En este caso, p3
tendrá X
y Y
con valor 0
.
Go también permite utilizar el operador new
para crear una estructura. Esto retorna un puntero a la estructura:
p4 := new(Point)
p4
es un puntero a una estructura Point
con valores por defecto 0
en X
e Y
.
Los campos de una estructura se acceden utilizando el operador punto (.
):
fmt.Println(p1.X) // Imprime: 10
p1.Y = 25 // Modifica el valor de Y a 25
Go permite anidar estructuras, es decir, una estructura puede contener otra estructura como campo. Esto es útil para modelar relaciones más complejas entre datos.
type Circle struct {
Center Point
Radius int
}
c := Circle{Center: Point{X: 5, Y: 5}, Radius: 10}
En este ejemplo, Circle
contiene una estructura Point
como su campo Center
.
En Go, puedes definir métodos en estructuras. Un método es una función con un receptor especial que puede ser una estructura. Esto permite asociar comportamientos con datos.
Para definir un método, se especifica un receptor antes del nombre de la función:
func (p Point) Distance() int {
return p.X*p.X + p.Y*p.Y
}
El receptor p
es una instancia de Point
. Puedes llamar este método en cualquier instancia de Point
:
d := p1.Distance() // Llama al método Distance de p1
fmt.Println(d)
Los métodos pueden tener receptores por valor o por referencia. Un receptor por valor no modifica la estructura original, mientras que un receptor por referencia (*
) sí puede hacerlo.
func (p Point) Move(dx, dy int) {
p.X += dx
p.Y += dy
}
Este método no modificará la estructura original Point
.
func (p *Point) Move(dx, dy int) {
p.X += dx
p.Y += dy
}
Este método modifica directamente la estructura Point
a la que apunta el receptor.
Go no soporta la herencia como otros lenguajes orientados a objetos, pero permite la composición a través del concepto de "embedding". Esto permite incluir una estructura dentro de otra, proporcionando una forma de reutilización de código.
type Person struct {
Name string
Age int
}
type Employee struct {
Person
EmployeeID int
}
En este ejemplo, Employee
incluye a Person
. Puedes acceder a los campos de Person
directamente desde una instancia de Employee
:
e := Employee{Person: Person{Name: "Alice", Age: 30}, EmployeeID: 12345}
fmt.Println(e.Name) // Imprime: Alice
Go permite asociar etiquetas (tags) a los campos de las estructuras. Estas etiquetas son útiles para proporcionar información adicional que puede ser utilizada por paquetes como encoding/json
para serialización y deserialización.
type User struct {
Name string `json:"name"`
Email string `json:"email"`
}
u := User{Name: "Bob", Email: "bob@example.com"}
jsonData, _ := json.Marshal(u)
fmt.Println(string(jsonData)) // Imprime: {"name":"Bob","email":"bob@example.com"}
En este ejemplo, las etiquetas json:"name"
y json:"email"
especifican los nombres de los campos en el formato JSON.
Las estructuras en Go son una herramienta poderosa y flexible para modelar datos complejos. Desde la creación e inicialización de estructuras hasta la definición de métodos y el uso de embedding, Go proporciona múltiples maneras de trabajar eficientemente con datos. La simplicidad y claridad de las estructuras en Go hacen que sea fácil escribir y mantener código, lo que es una de las razones por las que este lenguaje es tan popular en el desarrollo de software moderno.
Jorge García
Fullstack developer