Strukturfeldern neue Werte zuweisen
Stellen Sie sich das folgende Szenario vor: Eine Point-Klasse wird mit einer Move()-Methode definiert, die das x anpasst Koordinate und eine Print()-Methode zum Anzeigen von Ergebnissen. Der Code zeigt jedoch ein unerwartetes Verhalten und zeigt nach dem Aufruf von Move() den anfänglichen x-Wert anstelle des angepassten Werts an.
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() }
Das Problem ergibt sich aus der Tatsache, dass Move() als Wertempfänger definiert ist. Das bedeutet, dass es mit einer Kopie des ursprünglichen Point-Objekts arbeitet. Daher haben Änderungen an s innerhalb von Move() keine Auswirkungen auf die tatsächliche Instanz.
Um dieses Problem zu beheben, sollte die Move()-Methode als Zeigerempfänger definiert werden, der es ihr ermöglicht, direkt mit dem Originalobjekt zu interagieren:
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() }
Wenn nun Move() aufgerufen wird, zeigt die Variable s auf das ursprüngliche Point-Objekt, sodass sich Änderungen an s.x direkt auf die Instanz auswirken. Folglich zeigt der Aufruf von Print() nach Move() die aktualisierte x-Koordinate korrekt an.
Das obige ist der detaillierte Inhalt vonWarum ändert meine Go-Strukturmethode das ursprüngliche Objekt nicht?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!