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.
Sfida
FacileIn 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 è:
- Definire una struct
Sensorcon due campi:ID(stringa) eTemperature(float64) - Creare un metodo chiamato
displayReadingcon un receiver per valore che stampi le informazioni del sensore nel formato:"Sensor [ID]: [temperature]°C" - Creare un metodo chiamato
adjustTemperaturecon un receiver per valore che aggiunga il valore di regolazione alla temperatura e stampi:"Adjusted reading: [new_temperature]°C" - Analizzare gli input per creare un'istanza di
Sensor - Chiamare il metodo
displayReadingper mostrare la temperatura originale - Chiamare il metodo
adjustTemperaturecon il valore di regolazione - Chiamare di nuovo il metodo
displayReadingper 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
}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