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.

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() stringdecide cómo escribefmtel 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.