Menu
Coddy logo textTech

Receiver con puntatore

Fa parte della sezione Logica e flusso del percorso GO di Coddy. Lezione 8 di 68.

Mentre i receiver per valore lavorano con copie delle struct, i receiver per puntatore lavorano direttamente con l’istanza originale della struct. Quando definisci un metodo con un receiver per puntatore, il metodo può modificare i dati originali perché riceve un puntatore alla struct invece di una copia.

Per creare un receiver con puntatore, aggiungi un asterisco * prima del nome del tipo nella dichiarazione del receiver:

type Person struct {
    Name string
    Age  int
}

func (p *Person) haveBirthday() {
    p.Age++  // Questo modifica la struct originale
}

In questo esempio, (p *Person) è un ricevitore puntatore. Quando chiami il metodo haveBirthday su un'istanza di Person, il metodo riceve un puntatore alla struct originale. Qualsiasi modifica apportata ai campi della struct tramite questo puntatore modificherà permanentemente i dati originali.

I receiver puntatore sono essenziali quando i tuoi metodi devono aggiornare i campi della struct, rendendoli perfetti per le operazioni che modificano lo stato dei tuoi dati.

challenge icon

Sfida

Facile

In questa sfida, ti eserciterai a creare metodi con receiver puntatore realizzando un semplice sistema di conto bancario. Creerai una struct Account e definirai metodi che possono modificare il saldo del conto usando receiver puntatore.

Riceverai tre input:

  • Una stringa che rappresenta il nome del titolare del conto (ad es., "John Smith")
  • Una stringa che rappresenta il saldo iniziale del conto (ad es., "1000.50")
  • Una stringa che rappresenta l'importo della transazione (ad es., "250.75")

Il tuo compito è:

  1. Definire una struct Account con due campi: Name (string) e Balance (float64)
  2. Creare un metodo chiamato deposit con un receiver puntatore che aggiunge l'importo indicato al saldo del conto
  3. Creare un metodo chiamato withdraw con un receiver puntatore che sottrae l'importo indicato dal saldo del conto
  4. Creare un metodo chiamato displayBalance con un receiver per valore che stampa le informazioni del conto nel formato: "Account: [name], Balance: $[balance]"
  5. Analizzare gli input per creare un'istanza di Account
  6. Chiamare displayBalance per mostrare il saldo iniziale
  7. Chiamare deposit con l'importo della transazione
  8. Chiamare displayBalance per mostrare il saldo dopo il deposito
  9. Chiamare withdraw con l'importo della transazione
  10. Chiamare displayBalance per mostrare il saldo finale

Il saldo deve essere visualizzato con una precisione di due cifre decimali. Questa sfida mostra come i receiver puntatore permettano ai metodi di modificare i dati della struct originale, a differenza dei receiver per valore, che operano su copie.

Provalo tu

package main

import (
	"fmt"
	"strconv"
)

// TODO: Definisci qui la struct Account

// TODO: Definisci qui il metodo deposit con ricevitore puntatore

// TODO: Definisci qui il metodo withdraw con ricevitore puntatore

// TODO: Definisci qui il metodo displayBalance con ricevitore per valore

func main() {
	// Leggi l'input
	var name string
	var initialBalanceStr string
	var transactionAmountStr string
	
	fmt.Scanln(&name)
	fmt.Scanln(&initialBalanceStr)
	fmt.Scanln(&transactionAmountStr)
	
	// Converti le stringhe di input nei tipi appropriati
	initialBalance, _ := strconv.ParseFloat(initialBalanceStr, 64)
	transactionAmount, _ := strconv.ParseFloat(transactionAmountStr, 64)
	
	// TODO: Crea un'istanza di Account
	
	// TODO: Mostra il saldo iniziale, esegui un deposito, mostra il saldo, esegui un prelievo, mostra il saldo finale
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Logica e flusso

Esercitati da solo: Compilatore Go online