Heim > Backend-Entwicklung > Golang > Wie kann ich zwei identische Go-Strukturen effizient zusammenführen und dabei Werte ungleich Null aus der zweiten Struktur priorisieren?

Wie kann ich zwei identische Go-Strukturen effizient zusammenführen und dabei Werte ungleich Null aus der zweiten Struktur priorisieren?

Mary-Kate Olsen
Freigeben: 2024-12-03 16:04:15
Original
580 Leute haben es durchsucht

How Can I Efficiently Merge Two Identical Go Structs, Prioritizing Non-Zero Values from the Second Struct?

Felder zweier identischer Strukturen zusammenführen

Die Aufgabe besteht darin, zwei Strukturen desselben Typs so zusammenzuführen, dass Felder in der zweiten Struktur diejenigen in der ersten überschreiben, aber nur wenn sie gesetzt sind. Die Lösung sollte die Möglichkeit von Nullwerten berücksichtigen.

Reflexionsbasierter Ansatz

Ein erster Ansatz erwägt die Verwendung von Reflexion:

func merge(default *Config, file *Config) (*Config) {
  b := reflect.ValueOf(default).Elem()
  o := reflect.ValueOf(file).Elem()

  for i := 0; i < b.NumField(); i++ {
    defaultField := b.Field(i)
    fileField := o.Field(i)
    if defaultField.Interface() != reflect.Zero(fileField.Type()).Interface() {
     defaultField.Set(reflect.ValueOf(fileField.Interface()))
    }
  }

  return default
 }
Nach dem Login kopieren

Dieser Ansatz stößt jedoch auf Bedenken bezüglich der Verwendung von Reflektion und der Schwierigkeit, in allen Fällen auf Nullwerte zu prüfen.

JSON Unmarshaling Ansatz

Eine alternative Lösung nutzt das Paket „encoding/json“:

conf := new(Config) // New config
*conf = *defConfig  // Initialize with defaults

err := json.NewDecoder(strings.NewReader(fileContent)).Decode(&amp;conf)
if err != nil {
    panic(err)
}
Nach dem Login kopieren

Dieser Ansatz bietet mehrere Vorteile:

  • Er verarbeitet automatisch fehlende und Nullwerte im config-Datei.
  • Es behält explizite Überschreibungen auf Nullwerten bei.

Analyse of Results

Die Verwendung dieses Ansatzes mit der gegebenen Standardkonfiguration und dem Dateiinhalt erzeugt die folgende Ausgabe:

&amp;{S1: S2:file-s2 S3: S4:def S5:file-s5}
Nach dem Login kopieren

Dies zeigt, dass:

  • S1 fehlt in Die Datei bleibt ein Nullwert.
  • S2, in der Datei angegeben, überschreibt den Standardnullwert Wert.
  • S3, in der Datei explizit auf Null gesetzt, überschreibt den Standardwert ungleich Null.
  • S4, der in der Datei fehlt, behält seinen Standardwert.
  • S5, in der Datei angegeben, überschreibt den Standardwert.

Das obige ist der detaillierte Inhalt vonWie kann ich zwei identische Go-Strukturen effizient zusammenführen und dabei Werte ungleich Null aus der zweiten Struktur priorisieren?. 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