Aktualisieren von Strukturwerten in Go
In Go sind Strukturen Werttypen, was bedeutet, dass das Zuweisen einer Struktur zu einer anderen deren Werte kopiert und nicht eine Referenz erstellen. Dies kann zu unerwartetem Verhalten führen, wenn versucht wird, Werte innerhalb einer verschachtelten Struktur zu ändern.
Beachten Sie den folgenden Codeausschnitt:
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" } }
Die Absicht besteht darin, das Typfeld jedes Mod-Elements in zu aktualisieren Die FTR-Struktur basiert auf einer Reihe von Bedingungen. Nachdem der Code jedoch ausgeführt wurde, bleibt das Typfeld jedes Elements unverändert.
Dieses Verhalten wird durch die Tatsache verursacht, dass die Bereichsschleife über eine Kopie des ftr.Mod-Slice iteriert. Folglich werden alle an der Elementvariablen innerhalb der Schleife vorgenommenen Änderungen nicht im ursprünglichen ftr.Mod-Slice widergespiegelt.
Um dieses Problem zu beheben und die Werte in der ftr-Struktur korrekt zu aktualisieren, können Sie eine indexbasierte Iteration verwenden anstatt über die Scheibe zu reichen. Dadurch können Sie die Werte direkt im Original-Slice ändern:
type FTR struct { Id string Mod []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" } }
Indem Sie über die Indizes des ftr.Mod-Slices iterieren und die entsprechenden Elemente direkt ändern, stellen Sie sicher, dass die ursprüngliche FTR-Struktur als aktualisiert wird beabsichtigt.
Das obige ist der detaillierte Inhalt vonWie aktualisiere ich verschachtelte Strukturwerte in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!