Estructuras en Go

En Go, los arreglos pueden almacenar datos del mismo tipo, pero en una estructura podemos definir diferentes tipos de datos para diferentes elementos.

Una estructura es una colección de datos compuesta por una serie de datos del mismo tipo o de tipos diferentes.

Una estructura representa un registro, por ejemplo, un registro de libros de una biblioteca. Cada libro tiene los siguientes atributos:

  • Title: título
  • Author: autor
  • Subject: materia
  • ID: ID del libro

Definición de estructuras

La definición de una estructura requiere las sentencias `type` y `struct`. La sentencia `struct` define un nuevo tipo de datos, y la estructura contiene uno o más miembros. La sentencia `type` establece el nombre de la estructura. El formato de la estructura es el siguiente:

type struct_variable_type struct {
   member definition
   member definition
   ...
   member definition
}

Una vez definido el tipo de la estructura, se puede utilizar para declarar variables. La sintaxis es la siguiente:

variable_name := structure_variable_type {value1, value2...valuen}
o 
variable_name := structure_variable_type { key1: value1, key2: value2..., keyn: valuen}

A continuación se muestra un ejemplo:

Ejemplo

package main

import "fmt"

type Books struct {
   title string
   author string
   subject string
   book_id int
}


func main() {

    // Crear una nueva estructura
    fmt.Println(Books{"Lenguaje Go", "www.example.com", "Tutorial del lenguaje Go", 6495407})

    // También se puede usar el formato key => value
    fmt.Println(Books{title: "Lenguaje Go", author: "www.example.com", subject: "Tutorial del lenguaje Go", book_id: 6495407})

    // Los campos ignorados son 0 o vacíos
   fmt.Println(Books{title: "Lenguaje Go", author: "www.example.com"})
}

La salida es:

{Go 语言 www.example.com Go 语言教程 6495407}
{Go 语言 www.example.com Go 语言教程 6495407}
{Go 语言 www.example.com  0}

Acceso a miembros de la estructura

Para acceder a los miembros de la estructura, se necesita el punto.operador, cuyo formato es:

estructura.nombre del miembro

Las variables de tipo estructura se definen con la palabra clave `struct`. Un ejemplo es el siguiente:

Ejemplo

package main

import "fmt"

type Books struct {
   title string
   author string
   subject string
   book_id int
}

func main() {
   var Book1 Books        /* Declarar Book1 como tipo Books */
   var Book2 Books        /* Declarar Book2 como tipo Books */

   /* Descripción del libro 1 */
   Book1.title = "Lenguaje Go"
   Book1.author = "www.example.com"
   Book1.subject = "Tutorial del lenguaje Go"
   Book1.book_id = 6495407

   /* Descripción del libro 2 */
   Book2.title = "Tutorial de Python"
   Book2.author = "www.example.com"
   Book2.subject = "Tutorial del lenguaje Python"
   Book2.book_id = 6495700

   /* Imprimir la información de Book1 */
   fmt.Printf( "Book 1 title : %s\n", Book1.title)
   fmt.Printf( "Book 1 author : %s\n", Book1.author)
   fmt.Printf( "Book 1 subject : %s\n", Book1.subject)
   fmt.Printf( "Book 1 book_id : %d\n", Book1.book_id)

   /* Imprimir la información de Book2 */
   fmt.Printf( "Book 2 title : %s\n", Book2.title)
   fmt.Printf( "Book 2 author : %s\n", Book2.author)
   fmt.Printf( "Book 2 subject : %s\n", Book2.subject)
   fmt.Printf( "Book 2 book_id : %d\n", Book2.book_id)
}

El resultado de ejecución del ejemplo anterior es:

Book 1 title : Go 语言
Book 1 author : www.example.com
Book 1 subject : Go 语言教程
Book 1 book_id : 6495407
Book 2 title : Python 教程
Book 2 author : www.example.com
Book 2 subject : Python 语言教程
Book 2 book_id : 6495700

Estructura como parámetro de función

Puedes pasar una estructura como parámetro a una función igual que otros tipos de datos, y acceder a las variables de la estructura de la misma manera que en el ejemplo anterior:

Ejemplo

package main

import "fmt"

type Books struct {
   title string
   author string
   subject string
   book_id int
}

func main() {
   var Book1 Books        /* Declarar Book1 como tipo Books */
   var Book2 Books        /* Declarar Book2 como tipo Books */

   /* Descripción del libro 1 */
   Book1.title = "Lenguaje Go"
   Book1.author = "www.example.com"
   Book1.subject = "Tutorial del lenguaje Go"
   Book1.book_id = 6495407

   /* Descripción del libro 2 */
   Book2.title = "Tutorial de Python"
   Book2.author = "www.example.com"
   Book2.subject = "Tutorial del lenguaje Python"
   Book2.book_id = 6495700

   /* Imprimir la información de Book1 */
   printBook(Book1)

   /* Imprimir la información de Book2 */
   printBook(Book2)
}

func printBook( book Books ) {
   fmt.Printf( "Book title : %s\n", book.title)
   fmt.Printf( "Book author : %s\n", book.author)
   fmt.Printf( "Book subject : %s\n", book.subject)
   fmt.Printf( "Book book_id : %d\n", book.book_id)
}

El resultado de ejecución del ejemplo anterior es:

Book title : Go 语言
Book author : www.example.com
Book subject : Go 语言教程
Book book_id : 6495407
Book title : Python 教程
Book author : www.example.com
Book subject : Python 语言教程
Book book_id : 6495700

Punteros a estructuras

Puedes definir punteros a estructuras de manera similar a otras variables puntero, con el siguiente formato:

var struct_pointer *Books

La variable puntero definida anteriormente puede almacenar la dirección de una variable de estructura. Para ver la dirección de la variable de estructura, coloca el símbolo `&` delante de la variable de estructura:

struct_pointer = &Book1

Para acceder a los miembros de la estructura mediante un puntero a la estructura, se utiliza el operador `.`:

struct_pointer.title

A continuación, reescribamos el ejemplo anterior usando punteros a estructuras; el código es el siguiente:

Ejemplo

package main

import "fmt"

type Books struct {
   title string
   author string
   subject string
   book_id int
}

func main() {
   var Book1 Books        /* Declarar Book1 como tipo Books */
   var Book2 Books        /* Declarar Book2 como tipo Books */

   /* Descripción del libro 1 */
   Book1.title = "Lenguaje Go"
   Book1.author = "www.example.com"
   Book1.subject = "Tutorial del lenguaje Go"
   Book1.book_id = 6495407

   /* Descripción del libro 2 */
   Book2.title = "Tutorial de Python"
   Book2.author = "www.example.com"
   Book2.subject = "Tutorial del lenguaje Python"
   Book2.book_id = 6495700

   /* Imprimir la información de Book1 */
   printBook(&Book1)

   /* Imprimir la información de Book2 */
   printBook(&Book2)
}
func printBook( book *Books ) {
   fmt.Printf( "Book title : %s\n", book.title)
   fmt.Printf( "Book author : %s\n", book.author)
   fmt.Printf( "Book subject : %s\n", book.subject)
   fmt.Printf( "Book book_id : %d\n", book.book_id)
}

El resultado de ejecución del ejemplo anterior es:

Book title : Go 语言
Book author : www.example.com
Book subject : Go 语言教程
Book book_id : 6495407
Book title : Python 教程
Book author : www.example.com
Book subject : Python 语言教程
Book book_id : 6495700
Otras extensiones