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.
Sfida
FacileIn 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 è:
- Definire una struct
Accountcon due campi:Name(string) eBalance(float64) - Creare un metodo chiamato
depositcon un receiver puntatore che aggiunge l'importo indicato al saldo del conto - Creare un metodo chiamato
withdrawcon un receiver puntatore che sottrae l'importo indicato dal saldo del conto - Creare un metodo chiamato
displayBalancecon un receiver per valore che stampa le informazioni del conto nel formato:"Account: [name], Balance: $[balance]" - Analizzare gli input per creare un'istanza di
Account - Chiamare
displayBalanceper mostrare il saldo iniziale - Chiamare
depositcon l'importo della transazione - Chiamare
displayBalanceper mostrare il saldo dopo il deposito - Chiamare
withdrawcon l'importo della transazione - Chiamare
displayBalanceper 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
}Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Flusso di controllo avanzato
Switch con `fallthrough`Uscire dai cicli annidatiContinuare un ciclo specificoL'istruzione `goto`Riepilogo - Controllo avanzato dei cicli4Progetto: semplice lista di attività
Configurazione del progettoAggiungere un’attività2Struct e metodi
Definire metodi sugli structReceiver per valoreReceiver con puntatoreScegliere i receiverMetodi vs funzioniRiepilogo - comportamento degli struct5Mappe in dettaglio
Mappe di structPuntatori come valori delle mappeVerificare le mappe nilConfrontare le mappeRiepilogo - Contatore della frequenza delle parole3Interfacce (le basi)
Che cos’è un’interfaccia?Definire un’interfacciaImplementare un’interfacciaUsare i tipi interfacciaInterfaccia vuotaAsserzioni di tipoSwitch di tipoRiepilogo: forme e comportamentiEsercitati da solo: Compilatore Go online