Geekflare recibe el apoyo de nuestra audiencia. Podemos ganar comisiones de afiliación de los enlaces de compra en este sitio.
En Desarrollo Última actualización: 25 de septiembre de 2023
Compartir en:
Escáner de seguridad de aplicaciones web Invicti - la única solución que ofrece verificación automática de vulnerabilidades con Proof-Based Scanning™.

Los structs en Golang son uno de los más utilizados y una forma de crear tipos definidos por el usuario

En esto, voy a estar cubriendo todos los fundamentos acerca de los structs y cómo utilizarlos en sus programas go con un par de ejemplos

¡Empecemos!

Introducción

Un struct es una colección de múltiples campos de datos con sus tipos de datos definidos agrupados. Son útiles para agrupar datos y formar registros personalizados. Un struct consta tanto de tipos incorporados como de tipos definidos por el usuario (el propio struct es un tipo definido por el usuario)

Los struct en Golang son mutables, es decir, pueden modificarse a lo largo del programa

Los struct ayudan a mejorar la calidad general del código al permitirnos crear y pasar estructuras de datos complejas a través de múltiples módulos. Imagine pasar 10 parámetros a una función, pronto se quedará sin código. Esta es exactamente la razón por la que los structs son útiles, ahora en lugar de 10 parámetros usted simplemente pasa un único struct a esa función

Un struct se declara utilizando dos palabras clave – type y struct. Se envuelve con llaves (al igual que las clases en java) – que contiene un conjunto de campos que tienen un tipo definido y un identificador (nombre). Discutiremos los detalles de implementación en la siguiente sección.

Si usted viene de una programación orientada a objetos (POO) de fondo, se puede pensar en struct como una clase, pero sin herencia

Declarar structs

Ahora que ya sabe qué es un struct y por qué se utiliza, es hora de aprender a declarar structs. El esqueleto básico de un struct tiene el siguiente aspecto

type nombre_de_la_estructura struct {
 campo1 tipo_datos_campo1
 campo2 tipo_datos_campo2
 }

Aquí, type y struct son palabras clave, mientras que struct contiene múltiples campos con su tipo de datos definido

Veamos un ejemplo

package main

import (
"fmt"
)

type User struct {
name string
age int
bankBalance float32
}

func main() {
var user User
fmt.Println(user)

}
Aquí definimos una estructura User que consta de campos string, int y float32. En main () declaramos nuestra struct como user y la imprimimos ¡La salida que obtenemos es el valor cero/vacío de la struct ya que aún no la hemos inicializado! El valor cero es básicamente valores cero de cada campo

{ 0 0}

Inicializando structs

En la sección anterior, aprendimos cómo declarar structs. Ahora, queremos inicializarlos o asignarles valores. Compruebe en el código siguiente cómo lo hacemos –

package main

import (
"fmt"
)

type User struct {
name string
age int
bankBalance float32
}

func main() {
// Con los nombres de los campos
user1 := User{
name: "Mohit",
age:         24,
bankBalance: 100.0,
}
	
// Sin nombres de campo
user2 := User{"Nidhi", 21, 1000.0}
	
fmt.Println(user1)
fmt.Println(user2)

}
El propio código explica cómo inicializamos dos structs con y sin nombres de campo. Aquí, la salida será

{Mohit 24 100}
 {Nidhi 21 1000}

En el caso anterior, si uno de los campos no se inicializa, entonces ese campo toma por defecto su valor cero

usuario1 := Usuario{
nombre: "Mohit",
edad:         24,
}

 // Salida - { Mohit 24 0.0 }

Hay una forma más de crear structs utilizando la palabra clave new. Veremos cómo utilizarla en la siguiente sección

Acceso a los campos de un struct

Ahora que sabemos cómo crear e inicializar structs, veamos cómo acceder a los campos de un struct. Para ello, Golang nos proporciona el operador punto. Siguiendo con el ejemplo anterior, accedamos a los campos nombre y edad e imprimámoslos

package main

import (
"fmt"
)

type User struct {
name string
age int
bankBalance float32
}

func main() {
// Con los nombres de los campos
user := User{
name: "Mohit",
age:         24,
bankBalance: 100.0,
}

fmt.Println(user.name)
fmt.Println(user.age)
fmt.Println(user.bankBalance)

}
Aquí utilizamos struct_name.field_name para acceder a los campos de una struct. La salida del código anterior será

Mohit
 24
 100

Como se mencionó anteriormente, podemos crear structs con la palabra clave new. Veamos cómo –

user := new(Usuario)
 user.name = "Mohit"
 user.age = 24
 user.bankBalance = 100.0

 fmt.Println(user)

 // Salida - &{Mohit 24 100}

La palabra clave new devuelve el puntero a la estructura inicializada. En Golang no es necesario desreferenciar explícitamente el puntero, pero fmt .Println(*user ) daría la misma salida

Estructuras anidadas

Los struct en golang pueden contener también otros tipos definidos por el usuario. Así, un struct puede contener otros structs anidados

package main

import (
"fmt"
)

type User struct {
name string
age int
bankBalance float32
roleDetails RoleDetails
}

type RoleDetails struct {
position string
team string
}

func main() {
roleDetailForMohit := RoleDetails{
position: "Ingeniero de Software",
team:     "Transporte",
}
user := User{
name: "Mohit",
age:         24,
bankBalance: 100.0,
roleDetails: roleDetailForMohit,
}

fmt.Println(user)

}
En el código anterior, tenemos la estructura RoleDetails como parte de la estructura User. La salida será –

{Mohit 24 100 {Ingeniero de Software Transporte}}

Si desea acceder a roleDetails, puede hacerlo utilizando el mismo operador de punto

user.roleDetails.position

Igualdad de estructuras

Dos structs son iguales si cada uno de los campos que tienen son iguales (tanto los incorporados como los definidos por el usuario) pero no todos los tipos de datos son comparables. (map no es comparable directamente). Veamos un ejemplo para demostrar la igualdad

package main

import (
"fmt"
)

type User struct {
name string
age int
bankBalance float32
}

func main() {
user1 := User{
name: "Mohit",
age:         24,
bankBalance: 100.0,
}
user2 := Usuario{
nombre: "Mohit",
edad:         24,
bankBalance: 100.0,
}
user3 := Usuario{
name: "Nidhi",
age:         21,
bankBalance: 1000.0,
}

if usuario1 == usuario2 {
fmt.Println("usuario1 y usuario2 son iguales")
} else {
fmt.

Println(“usuario1 y usuario2

no son iguales")
}

if usuario1 == usuario3 {
fmt.Println("usuario1 y usuario3 son iguales")
} else {
fmt.Println("usuario1 y usuario3 no son iguales")
}

}
Los structs vacíos y de valor cero son iguales. El orden de los campos no importa, básicamente, cada campo debe coincidir para la igualdad. La salida para el código anterior será

user1 y user2 son iguales
user1 y user3 no son iguales

Conclusión

¡Impresionante!

Ahora está listo para usar structs en golang. Hemos cubierto todos los aspectos básicos como la declaración, la inicialización y el acceso a los campos struct. También vimos cómo comparar dos structs e incluso implementamos un struct anidado. Aquí hay algunos recursos para aprender más sobre structs –

Hay mucho más que aprender sobre los structs, pero es un buen comienzo por ahora. ¡Espero que haya aprendido algo nuevo!

Siga explorando. ¡Siga aprendiendo!

  • Mohit Khare
    Autor
Gracias a nuestros patrocinadores
Más lecturas sobre desarrollo
Potencia tu negocio
Algunas de las herramientas y servicios que le ayudarán a hacer crecer su negocio.
  • Invicti utiliza el Proof-Based Scanning™ para verificar automáticamente las vulnerabilidades identificadas y generar resultados procesables en tan solo unas horas.
    Pruebe Invicti
  • Web scraping, proxy residencial, gestor de proxy, desbloqueador web, rastreador de motores de búsqueda, y todo lo que necesita para recopilar datos web.
    Pruebe Brightdata
  • Monday.com es un sistema operativo de trabajo todo en uno que te ayuda a gestionar proyectos, tareas, trabajo, ventas, CRM, operaciones, flujos de trabajo y mucho más.
    Prueba Monday
  • Intruder es un escáner de vulnerabilidades en línea que encuentra puntos débiles de ciberseguridad en su infraestructura, para evitar costosas violaciones de datos.
    Prueba Intruder