Heim > Backend-Entwicklung > Golang > Warum ändert meine Go-Strukturmethode das ursprüngliche Objekt nicht?

Warum ändert meine Go-Strukturmethode das ursprüngliche Objekt nicht?

DDD
Freigeben: 2024-12-18 15:04:11
Original
846 Leute haben es durchsucht

Why Does My Go Struct Method Not Modify the Original Object?

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()
}
Nach dem Login kopieren

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()
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage