Menu
Coddy logo textTech

Receiver per valore

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

Quando definisci un metodo con un ricevitore di valore, il metodo opera su una copia dell'istanza della struct anziché sull'originale. Ciò significa che eventuali modifiche apportate al ricevitore all'interno del metodo non influiranno sulla variabile struct originale.

type Counter struct {
    Value int
}

func (c Counter) increment() {
    c.Value++  // Questo modifica la copia, non l'originale
}

In questo esempio, il metodo increment ha un ricevitore per valore (c Counter). Quando chiami questo metodo su un'istanza di Counter, Go crea una copia della struttura e la passa al metodo. Qualsiasi modifica a c.Value all'interno del metodo influisce solo su questa copia.

I receiver per valore sono utili quando il tuo metodo deve solo leggere i dati dalla struct senza modificarla. Sono sicuri da usare perché garantiscono che i dati originali rimangano invariati, rendendo il tuo codice più prevedibile e prevenendo effetti collaterali indesiderati.

challenge icon

Sfida

Facile

In questa sfida, farai pratica con i receiver per valore creando un semplice sistema di monitoraggio della temperatura. Creerai una struct Sensor e definirai metodi che dimostrano come i receiver per valore funzionano con copie della struct.

Riceverai tre input:

  • Una stringa che rappresenta l'ID del sensore (ad es., "TEMP001")
  • Una stringa che rappresenta la lettura della temperatura corrente (ad es., "23.5")
  • Una stringa che rappresenta un valore di regolazione della temperatura (ad es., "2.0")

Il tuo compito è:

  1. Definire una struct Sensor con due campi: ID (stringa) e Temperature (float64)
  2. Creare un metodo chiamato displayReading con un receiver per valore che stampi le informazioni del sensore nel formato: "Sensor [ID]: [temperature]°C"
  3. Creare un metodo chiamato adjustTemperature con un receiver per valore che aggiunga il valore di regolazione alla temperatura e stampi: "Adjusted reading: [new_temperature]°C"
  4. Analizzare gli input per creare un'istanza di Sensor
  5. Chiamare il metodo displayReading per mostrare la temperatura originale
  6. Chiamare il metodo adjustTemperature con il valore di regolazione
  7. Chiamare di nuovo il metodo displayReading per dimostrare che la struct originale rimane invariata

Questa sfida dimostrerà che i metodi con receiver per valore operano su copie della struct, quindi il valore della temperatura della struct originale rimarrà invariato anche dopo aver chiamato il metodo adjustTemperature. I valori della temperatura devono essere visualizzati con una precisione di una cifra decimale.

Provalo tu

package main

import (
    "fmt"
    "strconv"
)

// TODO: Definisci qui la struct Sensor

// TODO: Definisci qui il metodo displayReading con un ricevitore per valore

// TODO: Definisci qui il metodo adjustTemperature con un ricevitore per valore

func main() {
    // Leggi gli input
    var sensorID string
    var tempStr string
    var adjustStr string
    
    fmt.Scanln(&sensorID)
    fmt.Scanln(&tempStr)
    fmt.Scanln(&adjustStr)
    
    // Converti i valori della temperatura e della regolazione
    temperature, _ := strconv.ParseFloat(tempStr, 64)
    adjustment, _ := strconv.ParseFloat(adjustStr, 64)
    
    // TODO: Crea un'istanza di Sensor e chiama i metodi richiesti
    
}
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