DMarlon Studio

Lección 14 · 14 de 20

Estructuras · Go

Agrupe datos relacionados en un struct de Go: campos, literales por nombre o por orden, %+v, copias y slices de estructuras.

Go · Estructuras en DMarlon Studio: el código del ejemplo y su salida en la terminal

Un struct reúne varios datos relacionados en un tipo nuevo. type Book struct define un libro con cuatro campos: Title y Author, de texto (comparten tipo y van en la misma línea), Pages, entero, y Read, lógico. Los nombres empiezan por mayúscula, como es costumbre en Go para lo que se comparte con otros paquetes.

Un libro se crea con un literal. Con nombres, Book{Title: "Emma", ...}, se pueden omitir campos, que toman su valor cero: Read queda en false. Sin nombres hay que dar todos, en el orden de la definición, como en tale.

El punto lee y cambia un campo: novel.Read = true. fmt.Println escribe los valores entre llaves, y %+v añade el nombre de cada campo, muy útil para depurar.

Asignar un struct lo copia, como pasaba con los arrays: cambiar gift.Title no cambia tale. Un slice de estructuras, []Book, forma una pequeña estantería; dentro del literal no hace falta repetir Book en cada elemento. El for escribe cada libro en columnas y suma las páginas: 1132.

Código · main.go

package mainimport "fmt"// A struct groups related fields into one type.type Book struct {	Title, Author string	Pages         int	Read          bool}func main() {	// Fields by name; the missing ones take their zero value.	novel := Book{Title: "Emma", Author: "Jane Austen", Pages: 474}	tale := Book{"Matilda", "Roald Dahl", 240, true} // or all, in order	novel.Read = true // the dot reads and changes fields	fmt.Println(novel)	fmt.Printf("%+v\n", tale) // %+v also shows the field names	// Assigning a struct copies it.	gift := tale	gift.Title = "Matilda (gift)"	fmt.Println(tale.Title, "|", gift.Title)	// A slice of structs: a small bookshelf.	shelf := []Book{novel, tale, {Title: "Dracula", Author: "Bram Stoker", Pages: 418}}	total := 0	for i := 0; i < len(shelf); i++ {		fmt.Printf("%-8s %-12s %4d %v\n", shelf[i].Title, shelf[i].Author, shelf[i].Pages, shelf[i].Read)		total += shelf[i].Pages	}	fmt.Println("Total pages:", total)}

Salida · go run main.go

{Emma Jane Austen 474 true}
{Title:Matilda Author:Roald Dahl Pages:240 Read:true}
Matilda | Matilda (gift)
Emma     Jane Austen   474 true
Matilda  Roald Dahl    240 true
Dracula  Bram Stoker   418 false
Total pages: 1132

Para recordar

  • type Nombre struct { campos } define un tipo nuevo.
  • T{Campo: valor} permite omitir campos; T{v1, v2} los pide todos.
  • variable.Campo lee o cambia un campo.
  • %+v escribe un struct con los nombres de sus campos.
  • Asignar un struct hace una copia.

Ejercicio

Añada a Book un campo Year int, dele un año a cada libro y escriba solo los que tengan más de 400 páginas, junto con su año.