Menu
Coddy logo textTech

Receiver con puntatore vs receiver con valore

Fa parte della sezione Programmazione orientata agli oggetti del percorso GO di Coddy. Lezione 8 di 107.

I metodi possono avere un receiver per valore o un receiver per puntatore. Un receiver per valore opera su una copia della struct. Un receiver per puntatore opera sulla struct originale e può modificarne i campi.

Ricevitore per valore: opera su una copia

type Counter struct {
    Count int
}

func (c Counter) GetCount() int {
    return c.Count
}

// Questo NON modifica l'originale
func (c Counter) IncrementWrong() {
    c.Count++ // Modifica solo la copia!
}

Receiver puntatore: modifica l'originale

// Questo MODIFICA l'originale
func (c *Counter) Increment() {
    c.Count++
}

func (c *Counter) Reset() {
    c.Count = 0
}

Usandoli entrambi insieme

func main() {
    counter := Counter{Count: 0}

    counter.Increment()
    counter.Increment()
    fmt.Println(counter.GetCount()) // Salida: 2

    counter.Reset()
    fmt.Println(counter.GetCount()) // Salida: 0
}

Usa un ricevitore per valore quando il metodo legge soltanto i dati. Usa un ricevitore puntatore (*StructName) quando il metodo deve modificare i campi della struct. Go gestisce automaticamente il riferimento. Chiami entrambi allo stesso modo.

challenge icon

Sfida

Medio

Aggiungi metodi alla struct Wallet usando i tipi di receiver corretti:

  • GetBalance: receiver per valore, restituisce il saldo attuale
  • Deposit: receiver per puntatore, aggiunge l’importo al saldo
  • Withdraw: receiver per puntatore, sottrae l’importo solo se i fondi sono sufficienti

Provalo tu

package main

import "fmt"

func main() {
    var balance, deposit, withdraw float64
    fmt.Scan(&balance, &deposit, &withdraw)

    w := Wallet{Balance: balance}

    fmt.Printf("Balance: %.2f\n", w.GetBalance())

    w.Deposit(deposit)
    fmt.Printf("After deposit: %.2f\n", w.GetBalance())

    w.Withdraw(withdraw)
    fmt.Printf("After withdrawal: %.2f\n", w.GetBalance())

    fmt.Printf("Final balance: %.2f\n", w.GetBalance())
}
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 Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Go online