Receptores de puntero
Parte de la sección Lógica y Flujo del Journey de GO de Coddy. Lección 8 de 68.
Mientras que los receptores de valor funcionan con copias de las estructuras, los receptores de puntero funcionan directamente con la instancia de estructura original. Cuando defines un método con un receptor de puntero, el método puede modificar los datos originales porque recibe un puntero a la estructura en lugar de una copia.
Para crear un receptor de puntero, se añade un asterisco * antes del nombre del tipo en la declaración del receptor:
type Person struct {
Name string
Age int
}
func (p *Person) haveBirthday() {
p.Age++ // Esto modifica la estructura original
}En este ejemplo, (p *Person) es un receptor de puntero. Cuando llamas al método haveBirthday en una instancia de Person, el método recibe un puntero a la estructura original. Cualquier cambio realizado en los campos de la estructura a través de este puntero modificará permanentemente los datos originales.
Los receptores de puntero son esenciales cuando tus métodos necesitan actualizar los campos de la estructura, lo que los hace perfectos para las operaciones que cambian el estado de tus datos.
Desafío
FácilEn este desafío, practicarás la creación de métodos con receptores de puntero mediante la construcción de un sistema sencillo de cuentas bancarias. Crearás una estructura Account y definirás métodos que puedan modificar el saldo de la cuenta usando receptores de puntero.
Recibirás tres entradas:
- Una cadena que representa el nombre del titular de la cuenta (por ejemplo,
"John Smith") - Una cadena que representa el saldo inicial de la cuenta (por ejemplo,
"1000.50") - Una cadena que representa el importe de la transacción (por ejemplo,
"250.75")
Tu tarea es:
- Definir una estructura
Accountcon dos campos:Name(string) yBalance(float64) - Crear un método llamado
depositcon un receptor de puntero que sume el importe indicado al saldo de la cuenta - Crear un método llamado
withdrawcon un receptor de puntero que reste el importe indicado del saldo de la cuenta - Crear un método llamado
displayBalancecon un receptor de valor que muestre la información de la cuenta con el formato:"Account: [name], Balance: $[balance]" - Analizar las entradas para crear una instancia de
Account - Llamar a
displayBalancepara mostrar el saldo inicial - Llamar a
depositcon el importe de la transacción - Llamar a
displayBalancepara mostrar el saldo después del depósito - Llamar a
withdrawcon el importe de la transacción - Llamar a
displayBalancepara mostrar el saldo final
El saldo debe mostrarse con una precisión de dos decimales. Este desafío demuestra cómo los receptores de puntero permiten que los métodos modifiquen los datos de la estructura original, a diferencia de los receptores de valor, que trabajan con copias.
Pruébalo tú mismo
package main
import (
"fmt"
"strconv"
)
// TODO: Define la estructura Account aquí
// TODO: Define el método deposit con un receptor de puntero aquí
// TODO: Define el método withdraw con un receptor de puntero aquí
// TODO: Define el método displayBalance con un receptor de valor aquí
func main() {
// Leer entrada
var name string
var initialBalanceStr string
var transactionAmountStr string
fmt.Scanln(&name)
fmt.Scanln(&initialBalanceStr)
fmt.Scanln(&transactionAmountStr)
// Convertir las entradas de cadena a los tipos apropiados
initialBalance, _ := strconv.ParseFloat(initialBalanceStr, 64)
transactionAmount, _ := strconv.ParseFloat(transactionAmountStr, 64)
// TODO: Crear una instancia de Account
// TODO: Mostrar el saldo inicial, realizar el depósito, mostrar el saldo, realizar el retiro, mostrar el saldo final
}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 comportamientosPractica por tu cuenta: Compilador de Go online