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
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
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
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
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 : 6495700Otras extensiones