Definición de métodos en estructuras
Parte de la sección Lógica y Flujo del Journey de GO de Coddy — lección 6 de 68.
En Go, un método es una función que pertenece a un tipo específico. A diferencia de las funciones regulares que son independientes, los métodos se adjuntan a structs y le permiten definir el comportamiento para sus tipos de datos personalizados.
Para definir un método, se coloca un receptor entre la palabra clave func y el nombre del método. El receptor especifica a qué tipo pertenece el método.
type Person struct {
Name string
Age int
}
func (p Person) greet() {
fmt.Printf("Hello, my name is %s\n", p.Name)
}En este ejemplo, (p Person) es el receptor, lo que convierte a greet en un método del tipo Person. La variable p representa la instancia de Person sobre la cual se llama al método, de manera similar a this en otros lenguajes.
Luego puedes llamar al método usando la notación de punto en cualquier instancia de Person, otorgando a tus structs la capacidad de realizar acciones relacionadas con sus datos.
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Desafío
FácilEn este desafío, practicarás la definición de métodos en structs creando un sistema simple de gestión de libros. Crearás un struct Book y definirás métodos que permitan al libro mostrar su información.
Nota importante: Dado que los títulos de los libros y los nombres de los autores pueden contener espacios, deberás usar bufio.Scanner para leer líneas completas de entrada. La función fmt.Scanln deja de leer en el primer espacio, lo que rompería los títulos y nombres de autores de varias palabras. Usa bufio.NewScanner(os.Stdin) y llama a scanner.Scan() seguido de scanner.Text() para leer líneas completas.
Recibirás tres entradas:
- Una cadena que representa el título del libro (por ejemplo,
"The Go Programming Language") - Una cadena que representa el nombre del autor (por ejemplo,
"Alan Donovan") - Una cadena que representa el número de páginas (por ejemplo,
"380")
Tu tarea es:
- Definir un struct
Bookcon tres campos:Title(string),Author(string), yPages(int) - Crear un método llamado
displayInfocon un receptor de valor que imprima la información del libro en el formato:"Title: [title], Author: [author], Pages: [pages]" - Crear un método llamado
getDescriptioncon un receptor de valor que devuelva una cadena en el formato:"[title] by [author]" - Usar
bufio.Scannerpara leer las líneas de entrada correctamente:- Crear un scanner:
scanner := bufio.NewScanner(os.Stdin) - Para cada línea de entrada: llamar a
scanner.Scan()y luego ascanner.Text() - Esto asegura que los títulos y nombres de autores con espacios se lean correctamente
- Crear un scanner:
- Analizar las entradas para crear una instancia de
Book - Llamar al método
displayInfopara imprimir la información del libro - Llamar al método
getDescriptione imprimir la descripción devuelta
Los métodos deben usar la variable receptora para acceder a los campos del struct y realizar sus respectivas operaciones. Recuerda que los métodos con receptores de valor trabajan con una copia de la instancia del struct.
Hoja de referencia
Los métodos en Go son funciones que pertenecen a un tipo específico. Se definen con un receptor entre la palabra clave func y el nombre del método:
type Person struct {
Name string
Age int
}
func (p Person) greet() {
fmt.Printf("Hello, my name is %s\n", p.Name)
}El receptor (p Person) convierte a greet en un método del tipo Person. La variable p representa la instancia sobre la cual se llama al método.
Los métodos se llaman utilizando la notación de punto en las instancias de struct, lo que permite que los structs realicen acciones relacionadas con sus datos.
Pruébalo tú mismo
package main
import (
"bufio"
"fmt"
"os"
"strconv"
)
// TODO: Define tu estructura Book aquí
// TODO: Define tu método displayInfo aquí
// TODO: Define tu método getDescription aquí
func main() {
// Crear un escáner para leer las líneas de entrada
scanner := bufio.NewScanner(os.Stdin)
// Leer el título
scanner.Scan()
title := scanner.Text()
// Leer el autor
scanner.Scan()
author := scanner.Text()
// Leer las páginas
scanner.Scan()
pagesStr := scanner.Text()
// Convertir la cadena de páginas a entero
pages, _ := strconv.Atoi(pagesStr)
// TODO: Crear una instancia de Book y llamar a los métodos
}Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Lógica y Flujo
1Flujo de control avanzado
Switch con `fallthrough`Salir de bucles anidadosContinuar un bucle específicoLa sentencia `goto`Repaso: Control de bucles avanzado4Proyecto: Lista de tareas sencilla
Configuración del proyectoAñadir una tarea2Estructuras y Métodos
Definición de métodos en estructurasReceptores de valorReceptores de punteroElegir receptoresMétodos vs FuncionesResumen - Comportamiento de estructuras5Mapas en profundidad
Mapas de StructsPunteros como valores de MapVerificación de Maps NilComparación de MapsResumen - Contador de frecuencia de palabras3Interfaces (Conceptos básicos)
¿Qué es una interfaz?Definir una interfazImplementar una interfazUso de tipos de interfazInterfaz vacíaAserciones de tipoType SwitchResumen: Formas y comportamientos