Heim >Backend-Entwicklung >Golang >Wie wirken sich Zeigerempfänger in Go auf Strukturänderungen innerhalb von Funktionen aus?
Strukturfeldwerte ändern
Wenn eine Funktion in Go eine Struktur empfängt, erhält sie im Allgemeinen eine Kopie des Originalobjekts. Daher wirken sich alle an der Struktur innerhalb dieser Funktion vorgenommenen Änderungen nicht auf das ursprüngliche Objekt aus.
Betrachten Sie das folgende Beispiel, in dem wir einen Strukturpunkt mit zwei Feldern x und dx definieren. Die Move-Methode erhöht x um dx und die Print-Methode gibt den Wert von x aus.
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() }
In diesem Code werden die Move- und Print-Methoden als Wertempfänger an die Point-Struktur angehängt. Das bedeutet, dass bei der Übergabe von st an diese Methoden eine Kopie des ursprünglichen st-Objekts erstellt wird. Alle innerhalb dieser Methoden an der Kopie vorgenommenen Änderungen wirken sich nicht auf das ursprüngliche st-Objekt aus.
Wenn wir daher st.Move() aufrufen, wird die Kopie von st geändert, das ursprüngliche st-Objekt bleibt jedoch unverändert . Wenn wir st in st.Print() drucken, sehen wir daher immer noch den ursprünglichen Wert von x.
Um dieses Problem zu beheben, müssen wir die Methoden „Move“ und „Print“ ändern, um Zeigerempfänger anstelle von Wertempfängern zu verwenden. Dadurch wird sichergestellt, dass sich alle innerhalb dieser Methoden an der Struktur vorgenommenen Änderungen auf das ursprüngliche Objekt auswirken.
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 von Zeigerempfängern erhalten wir nun die erwartete Ausgabe:
2014/07/28 15:49:44 New X=5 2014/07/28 15:49:44 Final X=5
Das obige ist der detaillierte Inhalt vonWie wirken sich Zeigerempfänger in Go auf Strukturänderungen innerhalb von Funktionen aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!