Einem Strukturfeld einen neuen Wert zuweisen
In Go ist es beim Umgang mit Strukturen wichtig, das Konzept von Wertempfängern versus Wertempfängern zu verstehen Zeigerempfänger. Ein Wertempfänger arbeitet mit einer Kopie des Originalwerts, während ein Zeigerempfänger direkt mit dem Originalwert arbeitet.
Betrachten Sie diesen Codeausschnitt, in dem die Frage nach unerwartet unveränderten Strukturfeldwerten aufgeworfen wird:
type Point struct { x, dx int } func (s Point) Move() { s.x += s.dx log.Printf("New X=%d", s.x) } func (s Point) Print() { log.Printf("Final X=%d", s.x) } func main() { st := Point{ 3, 2 }; st.Move() st.Print() }
Die Erwartung besteht darin, dass die Move()-Methode das x-Feld der Point-Struktur ändert, was sich in der Print()-Methode widerspiegeln sollte. Die Ausgabe zeigt jedoch, dass das x-Feld unverändert bleibt.
Die Lösung: Verwendung von Zeigerempfängern
Das Problem liegt in der Verwendung eines Wertempfängers im Move( ) und Print()-Methoden. In Go wird alles als Wert übergeben, was bedeutet, dass bei der Übergabe einer Struktur an eine Funktion eine Kopie des Originalwerts erstellt wird. Daher haben alle an der Kopie innerhalb der Funktion vorgenommenen Änderungen keinen Einfluss auf den ursprünglichen Wert.
Um dieses Problem zu lösen, müssen wir Zeigerempfänger verwenden. Ein Zeigerempfänger ermöglicht es der Funktion, direkt auf dem ursprünglichen Wert zu arbeiten. Hier ist der korrigierte Code:
type Point struct { x, dx int } func (s *Point) Move() { s.x += s.dx log.Printf("New X=%d", s.x) } func (s *Point) Print() { log.Printf("Final X=%d", s.x) } func main() { st := Point{ 3, 2 }; st.Move() st.Print() }
Durch die Verwendung eines Zeigerempfängers für die Methoden Move() und Print() arbeiten wir jetzt direkt an der ursprünglichen Point-Struktur und die Änderungen am x-Feld werden korrekt wiedergegeben .
Das obige ist der detaillierte Inhalt vonWarum ändert das Ändern eines Go-Strukturfelds in einer Wertempfängermethode nicht den ursprünglichen Wert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!