DMarlon Studio

Lección 15 · 15 de 20

Métodos · Go

Añada métodos a sus tipos en Go: receptores por valor y por puntero, y el método String() que decide cómo se escribe un valor.

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

Un método es una función unida a un tipo. Se escribe como una función, pero con un receptor entre paréntesis antes del nombre: func (r Room) Area() float64. Dentro, r es la habitación con la que se llama, y el método se usa con el punto: flat[i].Area().

Con un receptor por valor, (r Room), el método recibe una copia, que basta para leer, como en Area. Para cambiar la habitación original hace falta un receptor por puntero, (r *Room): Extend alarga el baño un metro, de 2.5 a 3.5. Al llamar a flat[2].Extend(1), Go pasa la dirección por usted; la lección siguiente explica los punteros.

Si un tipo tiene un método String() string, fmt lo usa para escribirlo. Por eso %v muestra Kitchen 3.0 x 4.5 m en lugar de {Kitchen 3 4.5}. El propio método construye ese texto con fmt.Sprintf.

El for recorre el piso, escribe cada habitación con su superficie y las suma: 34.50 m². Go no tiene clases: un struct con sus métodos cumple ese papel.

Código · main.go

package mainimport "fmt"type Room struct {	Name          string	Width, Length float64}// A method has a receiver before its name: (r Room).func (r Room) Area() float64 {	return r.Width * r.Length}// A pointer receiver (*Room) can change the original room.func (r *Room) Extend(meters float64) {	r.Length += meters}// String() decides how fmt prints a Room.func (r Room) String() string {	return fmt.Sprintf("%-8s %.1f x %.1f m", r.Name, r.Width, r.Length)}func main() {	flat := []Room{{"Kitchen", 3, 4.5}, {"Bedroom", 3.5, 4}, {"Bath", 2, 2.5}}	flat[2].Extend(1) // Go passes &flat[2] for us	total := 0.0	for i := 0; i < len(flat); i++ {		fmt.Printf("%v -> %5.2f m2\n", flat[i], flat[i].Area())		total += flat[i].Area()	}	fmt.Printf("Whole flat: %.2f m2\n", total)}

Salida · go run main.go

Kitchen  3.0 x 4.5 m -> 13.50 m2
Bedroom  3.5 x 4.0 m -> 14.00 m2
Bath     2.0 x 3.5 m ->  7.00 m2
Whole flat: 34.50 m2

Para recordar

  • Un método lleva un receptor: func (r T) Nombre().
  • El receptor por valor trabaja con una copia.
  • El receptor por puntero, (r *T), cambia el original.
  • String() string decide cómo escribe fmt el tipo.

Ejercicio

Añada un método Perimeter() float64 y otro Rename(name string) con receptor por puntero; cambie el nombre del dormitorio y escriba el perímetro de cada habitación.