Heim  >  Artikel  >  Backend-Entwicklung  >  Warum ändert das Aktualisieren von Werten in einer Go-Struktur innerhalb einer Schleife nicht die ursprüngliche Struktur?

Warum ändert das Aktualisieren von Werten in einer Go-Struktur innerhalb einer Schleife nicht die ursprüngliche Struktur?

DDD
DDDOriginal
2024-11-16 15:07:03262Durchsuche

Why Does Updating Values in a Go Struct Inside a Loop Not Modify the Original Struct?

Wert in Struktur aktualisieren

Beim Umgang mit Strukturen kann das Aktualisieren von Werten eine Herausforderung darstellen. Betrachten Sie den folgenden Code:

ftr := FTR{}

err = yaml.Unmarshal([]byte(yamlFile), &ftr)

for index, element := range ftr.Mod {

    switch element.Type {
    case “aaa”, “bbbb”:
        element.Type = "cccc”
    case "htr”:
        element.Type = "com"
    case "no":
        element.Type = "jnodejs"
    case "jdb”:
        element.Type = "tomcat"
    }

}

Nach der Ausführung dieser Schleife wird die ursprüngliche FTR-Struktur trotz der offensichtlichen Aktualisierungen innerhalb der Schleife nicht geändert. Was könnte das Problem sein?

Das Problem: Zeiger und Struct Unwrap

In Go wird durch die Übergabe einer Struktur an eine Funktion per Wert eine Kopie der Struktur erstellt, im Gegensatz dazu Übergabe als Referenz, die einen Zeiger auf die ursprüngliche Struktur bereitstellt. In diesem Fall erstellt die Iteration über ftr.Mod mithilfe von range Kopien der Mod-Elemente, was bedeutet, dass alle innerhalb der Schleife vorgenommenen Änderungen nicht in der ursprünglichen ftr-Struktur widergespiegelt werden.

Die Lösung: Verwendung von Indizes und Zeigern

Um die ursprüngliche FTR-Struktur zu ändern, befolgen Sie diese Schritte:

  1. Verwenden Sie Indizes zum Iterieren: Iterieren Sie über die Indizes von ftr.Mod statt die Elemente selbst.
  2. Zeiger verwenden: Ändern Sie den Mod-Typ in der Strukturdefinition in []*Mod.
  3. Zugriff auf die Zeiger: Innerhalb Greifen Sie in der Schleife mithilfe von Zeigern auf die Werte von Mod-Elementen zu: *ftr.Mod[index].

Hier ist der geänderte Code:

type FTR struct {
    Id       string     
    Mod      []*Mod  // Use pointers for Mod
}

for index := range ftr.Mod{
    switch (*ftr.Mod[index]).Type {
    case “aaa”, “bbbb”:
        (*ftr.Mod[index]).Type = "cccc”
    case "htr”:
        (*ftr.Mod[index]).Type = "com"
    case "no":
        (*ftr.Mod[index]).Type = "jnodejs"
    case "jdb”:
        (*ftr.Mod[index]).Type = "tomcat"
    }

}

Durch die Verwendung von Zeigern können Sie direkt Ändern Sie die Werte in der ursprünglichen FTR-Struktur.

Das obige ist der detaillierte Inhalt vonWarum ändert das Aktualisieren von Werten in einer Go-Struktur innerhalb einer Schleife nicht die ursprüngliche Struktur?. 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