Value Receiver
Teil des Abschnitts Logik & Ablauf der GO-Journey von Coddy — Lektion 7 von 68.
Wenn Sie eine Methode mit einem Value-Receiver definieren, operiert die Methode auf einer Kopie der Struct-Instanz anstatt auf dem Original. Dies bedeutet, dass alle Änderungen, die innerhalb der Methode am Receiver vorgenommen werden, die ursprüngliche Struct-Variable nicht beeinflussen.
type Counter struct {
Value int
}
func (c Counter) increment() {
c.Value++ // Dies verändert die Kopie, nicht das Original
}In diesem Beispiel hat die increment-Methode einen Value-Receiver (c Counter). Wenn Sie diese Methode auf einer Counter-Instanz aufrufen, erstellt Go eine Kopie des Structs und übergibt diese an die Methode. Jegliche Änderungen an c.Value innerhalb der Methode wirken sich nur auf diese Kopie aus.
Value-Receiver sind nützlich, wenn Ihre Methode nur Daten aus dem Struct lesen muss, ohne es zu modifizieren. Sie sind sicher in der Anwendung, da sie garantieren, dass die Originaldaten unverändert bleiben, was Ihren Code vorhersehbarer macht und unbeabsichtigte Seiteneffekte verhindert.
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Aufgabe
EinfachIn dieser Herausforderung üben Sie die Arbeit mit Value Receivern, indem Sie ein einfaches Temperaturüberwachungssystem erstellen. Sie erstellen ein Sensor-Struct und definieren Methoden, die demonstrieren, wie Value Receiver mit Kopien des Structs arbeiten.
Sie erhalten drei Eingaben:
- Ein String, der die Sensor-ID darstellt (z. B.
"TEMP001") - Ein String, der den aktuellen Temperaturmesswert darstellt (z. B.
"23.5") - Ein String, der einen Temperaturanpassungswert darstellt (z. B.
"2.0")
Ihre Aufgabe ist es:
- Definieren Sie ein
Sensor-Struct mit zwei Feldern:ID(string) undTemperature(float64) - Erstellen Sie eine Methode namens
displayReadingmit einem Value Receiver, die die Sensorinformationen im Format"Sensor [ID]: [temperature]°C"ausgibt - Erstellen Sie eine Methode namens
adjustTemperaturemit einem Value Receiver, die den Anpassungswert zur Temperatur addiert und"Adjusted reading: [new_temperature]°C"ausgibt - Parsen Sie die Eingaben, um eine
Sensor-Instanz zu erstellen - Rufen Sie die Methode
displayReadingauf, um die ursprüngliche Temperatur anzuzeigen - Rufen Sie die Methode
adjustTemperaturemit dem Anpassungswert auf - Rufen Sie die Methode
displayReadingerneut auf, um zu demonstrieren, dass das ursprüngliche Struct unverändert bleibt
Diese Herausforderung wird zeigen, dass Methoden mit Value Receivern auf Kopien des Structs arbeiten, sodass der Temperaturwert des ursprünglichen Structs auch nach dem Aufruf der Methode adjustTemperature unverändert bleibt. Die Temperaturwerte sollten mit einer Nachkommastelle Genauigkeit angezeigt werden.
Spickzettel
Value-Receiver arbeiten auf einer Kopie der Struct-Instanz, nicht auf dem Original. Änderungen, die innerhalb der Methode vorgenommen werden, wirken sich nicht auf das ursprüngliche Struct aus.
type Counter struct {
Value int
}
func (c Counter) increment() {
c.Value++ // Dies modifiziert die Kopie, nicht das Original
}Value-Receiver sind nützlich, wenn Methoden Daten nur lesen müssen, ohne das ursprüngliche Struct zu verändern, was den Code vorhersehbarer macht und unbeabsichtigte Nebenwirkungen verhindert.
Probier es selbst
package main
import (
"fmt"
"strconv"
)
// TODO: Definiere hier dein Sensor-Struct
// TODO: Definiere hier deine displayReading-Methode mit Value-Receiver
// TODO: Definiere hier deine adjustTemperature-Methode mit Value-Receiver
func main() {
// Eingaben lesen
var sensorID string
var tempStr string
var adjustStr string
fmt.Scanln(&sensorID)
fmt.Scanln(&tempStr)
fmt.Scanln(&adjustStr)
// Temperatur- und Anpassungswerte parsen
temperature, _ := strconv.ParseFloat(tempStr, 64)
adjustment, _ := strconv.ParseFloat(adjustStr, 64)
// TODO: Erstelle eine Sensor-Instanz und rufe die erforderlichen Methoden auf
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Ablauf
1Fortgeschrittener Kontrollfluss
Switch mit `fallthrough`Abbrechen von verschachtelten SchleifenFortsetzen einer bestimmten SchleifeDie `goto`-AnweisungZusammenfassung – Fortgeschrittene Schleifensteuerung4Projekt: Einfache Aufgabenliste
Projekt-SetupEine Aufgabe hinzufügen2Structs und Methoden
Methoden für Structs definierenValue ReceiverPointer ReceiverReceiver auswählenMethoden vs. FunktionenZusammenfassung – Struct-Verhalten5Maps im Detail
Maps von StructsPointer als Map-WertePrüfen auf Nil-MapsMaps vergleichenZusammenfassung – Wortfrequenz-Zähler8Projekt: Einfache Bestandsverwaltung
ProjektübersichtLagerbestand prüfen11Abschlussherausforderungen
Einfache KontaktlisteEinfacher Zahlen-ValidatorSammler für eindeutige Elemente3Interfaces (Die Grundlagen)
Was ist ein Interface?Ein Interface definierenEin Interface implementierenInterface-Typen verwendenLeeres InterfaceType AssertionsType SwitchZusammenfassung – Formen und Verhalten