Tracks
/
Go
Go
/
Temario
/
Structs
St

Structs en Go

1 ejercicio

Acerca de Structs

En Go, un struct es una secuencia de elementos con nombre llamados campos, y cada campo tiene un nombre y un tipo. El nombre de un campo debe ser único dentro del struct. Los structs se pueden comparar con las clases del paradigma de la programación orientada a objetos.

Definir un struct

Creas un struct nuevo con las palabras clave type y struct, y defines explícitamente el nombre y el tipo de los campos. Por ejemplo, aquí definimos el struct Shape, que guarda el nombre de una figura y su tamaño:

type Shape struct {
    name string
    size int
}

Los nombres de los campos en los structs siguen la convención de Go: los campos cuyo nombre empieza con minúscula solo son visibles para el código del mismo paquete, mientras que los que empiezan con mayúscula son visibles en otros paquetes.

Crear instancias de un struct

Una vez que hayas definido el struct, necesitas crear una instancia nueva definiendo los campos con su nombre de campo, en cualquier orden:

s := Shape {
    name: "Square",
    size: 25,
}

Para leer o modificar los campos de una instancia, usa la notación .:

// Update the name and the size
s.name = "Circle"
s.size = 35
fmt.Printf("name: %s size: %d\n", s.name, s.size)
// Output: name: Circle size: 35

Los campos a los que no se les asigna un valor inicial tendrán su valor cero. Por ejemplo:

s := Shape{name: "Circle"}
fmt.Printf("name: %s size: %d\n", s.name, s.size)
// Output: name: Circle size: 0

Puedes crear una instancia de un struct sin usar los nombres de los campos, siempre que definas los campos en orden:

s := Shape {
	"Oval",
	20,
}

Sin embargo, esta sintaxis se considera código frágil, ya que puede romperse cuando se agrega un campo, sobre todo si el campo nuevo es de otro tipo. En el siguiente ejemplo agregamos un campo extra a Shape:

type Shape struct {
	name        string
	description string // new field 'description' added
	size        int
}

s := Shape{
    "Circle",
    20,
}
// Since the second field of the struct is now a string and not an int,
// the compiler will throw an error when compiling the program:
// Output: cannot use 20 (type untyped int) as type string in field value
// Output: too few values in Shape{...}

Las funciones «New»

A veces es útil tener funciones que nos ayuden a crear instancias de un struct. Por convención, estas funciones suelen llamarse New o tener nombres que empiezan con New, pero como son funciones normales y corrientes, puedes darles el nombre que quieras. Puede que te recuerden a los constructores de otros lenguajes, pero en Go son solo funciones normales.

En el siguiente ejemplo, se usa una de estas funciones New para crear una instancia nueva de Shape y establecer automáticamente un valor predeterminado para el size de la figura:

func NewShape(name string) Shape {
	return Shape{
		name: name,
		size: 100, //default-value for size is 100
	}
}

NewShape("Triangle")
// => Shape { name: "Triangle", size: 100 }

Usar funciones New puede tener las siguientes ventajas:

  • validación de los valores dados
  • manejo de valores predeterminados
  • como las funciones New a menudo se declaran en el mismo paquete que los structs que inicializan, pueden inicializar incluso los campos privados del struct

Para profundizar más en este tipo, puedes consultar estos recursos: Go by Example: Structs, A Tour of Go: Structs o Structures in Go (structs)

La función incorporada new

Otra forma de crear una instancia nueva de un struct es usar la función incorporada new:

s := new(Shape) // s will be of type *Shape (pointer to shape)
fmt.Printf("name: %s size: %d\n", s.name, s.size)
// Output: name:  size: 0

En este ejemplo, new crea una instancia del struct Shape con todos los valores inicializados al valor cero de su tipo y devuelve un puntero a ella.

Note

La mayoría de las veces no verás instancias nuevas de structs creadas con la función incorporada new. Prefiere siempre un literal de struct, una función New personalizada o cualquier otra función que ofrezca el paquete y que te ayude a construir un struct. Usa la función incorporada new para crear instancias nuevas de structs solo como último recurso.

Editar en GitHub El enlace se abre en una ventana o pestaña nueva

Aprende Structs