Menu
Coddy logo textTech

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.

challenge icon

Desafío

Fácil

En 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:

  1. Definir una estructura Account con dos campos: Name (string) y Balance (float64)
  2. Crear un método llamado deposit con un receptor de puntero que sume el importe indicado al saldo de la cuenta
  3. Crear un método llamado withdraw con un receptor de puntero que reste el importe indicado del saldo de la cuenta
  4. Crear un método llamado displayBalance con un receptor de valor que muestre la información de la cuenta con el formato: "Account: [name], Balance: $[balance]"
  5. Analizar las entradas para crear una instancia de Account
  6. Llamar a displayBalance para mostrar el saldo inicial
  7. Llamar a deposit con el importe de la transacción
  8. Llamar a displayBalance para mostrar el saldo después del depósito
  9. Llamar a withdraw con el importe de la transacción
  10. Llamar a displayBalance para 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
}
quiz iconPonte a prueba

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

Practica por tu cuenta: Compilador de Go online