Heim >Backend-Entwicklung >Golang >Wie wirken sich Zeigerempfänger in Go auf Strukturänderungen innerhalb von Funktionen aus?

Wie wirken sich Zeigerempfänger in Go auf Strukturänderungen innerhalb von Funktionen aus?

Barbara Streisand
Barbara StreisandOriginal
2024-12-23 13:10:21467Durchsuche

How Do Pointer Receivers in Go Impact Struct Modification Within Functions?

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!

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