Heim > Backend-Entwicklung > Golang > Wie ändere ich Strukturfelder in Go richtig?

Wie ändere ich Strukturfelder in Go richtig?

Mary-Kate Olsen
Freigeben: 2024-12-17 17:58:10
Original
220 Leute haben es durchsucht

How to Correctly Modify Struct Fields in Go?

Zuweisen neuer Werte zu Strukturfeldern in Go

In Go werden Strukturen häufig verwendet, um verwandte Daten zu kapseln und eine Reihe von Methoden dafür bereitzustellen manipulieren ihre Felder. Ein häufiges Problem bei der Arbeit mit Strukturfeldern besteht jedoch darin, deren Werte korrekt zu ändern.

Im folgenden Beispiel wird eine Struktur namens Point mit zwei Feldern, x und dx, erstellt. Zwei Methoden, Move() und Print(), sind definiert, um das x-Feld zu ändern bzw. auszugeben.

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

In main() wird eine neue Point-Instanz mit den Standardwerten x=3 und erstellt dx=2. Die Methoden Move() und Print() werden aufgerufen, mit der Erwartung, dass der Wert des x-Felds während Move() geändert wird und die Ausgabe von Print() den aktualisierten Wert widerspiegelt (Final x=5). Die tatsächliche Ausgabe lautet jedoch wie folgt:

2014/07/28 15:49:44 New X=5
2014/07/28 15:49:44 Final X=3
Nach dem Login kopieren

Dieses unerwartete Verhalten tritt auf, weil der Empfänger beider Methoden als Wertempfänger (d. h. Punkt) und nicht als Zeigerempfänger (*Punkt) definiert ist. Wenn in Go ein Wert an eine Methode mit einem Wertempfänger übergeben wird, wird eine Kopie dieses Werts innerhalb der Methode erstellt und alle an den Feldern dieser Kopie vorgenommenen Änderungen wirken sich nicht auf den Originalwert aus.

Um dieses Problem zu beheben und die ursprüngliche Struktur zu ändern, muss in beiden Methoden ein Zeigerempfänger verwendet werden. Dadurch wird sichergestellt, dass die Methoden direkt auf der ursprünglichen Struktur arbeiten und alle darin vorgenommenen Änderungen in der ursprünglichen Instanz widergespiegelt werden.

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

Mit dieser Änderung aktualisiert die Move()-Methode das x-Feld korrekt und die Die Methode Print() gibt den aktualisierten Wert aus.

Das obige ist der detaillierte Inhalt vonWie ändere ich Strukturfelder in Go richtig?. 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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage