Heim >Backend-Entwicklung >Golang >Warum ändert das Ändern eines Go-Strukturfelds in einer Wertempfängermethode nicht den ursprünglichen Wert?

Warum ändert das Ändern eines Go-Strukturfelds in einer Wertempfängermethode nicht den ursprünglichen Wert?

DDD
DDDOriginal
2024-12-15 17:16:18118Durchsuche

Why Doesn't Modifying a Go Struct Field in a Value Receiver Method Change the Original Value?

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!

Stellungnahme:
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