Heim >Backend-Entwicklung >Golang >Wie kann ich zwei Go-Strukturen desselben Typs effizient zusammenführen?

Wie kann ich zwei Go-Strukturen desselben Typs effizient zusammenführen?

Linda Hamilton
Linda HamiltonOriginal
2024-12-21 13:56:09858Durchsuche

How Can I Efficiently Merge Two Go Structs of the Same Type?

Strukturen desselben Typs mit Reflection oder JSON-Unmarshalling zusammenführen

In Go kann es vorkommen, dass Sie zwei Strukturen zusammenführen müssen vom gleichen Typ, wobei Werte aus einer Struktur möglicherweise diejenigen in einer anderen überschreiben. In diesem Artikel werden zwei Ansätze untersucht, um dies zu erreichen: die Verwendung der Reflexionsfunktionen von Go oder das Unmarshalling von JSON-Daten in eine vorbereitete Standardkonfiguration.

Reflexionsansatz (nicht empfohlen)

Der Reflexionsansatz , wie unten dargestellt, erfordert die Prüfung auf Nullwerte, um zu bestimmen, welche Felder überschrieben werden sollen. Diese Lösung ist jedoch nicht ideal, weil:

<br>func merge(default <em>Config, file </em>Config) (*Config) {<br> b := reflektieren. ValueOf(default).Elem()<br> o := reflektieren.ValueOf(file).Elem()</p>
<p>for i := 0; ich < b.NumField(); i {</p><pre class="brush:php;toolbar:false">defaultField := b.Field(i)
fileField := o.Field(i)
if defaultField.Interface() != reflect.Zero(fileField.Type()).Interface() {
 defaultField.Set(reflect.ValueOf(fileField.Interface()))
}

}

return default
}

  • Es beruht auf Reflexion, die ineffizient sein kann und fehleranfällig.
  • Es wird davon ausgegangen, dass in der Standardkonfiguration immer Nullwerte eingestellt sind, was möglicherweise nicht in allen Fällen zutrifft Fälle.
  • Explizite Überschreibungen von Nullwerten in der Dateikonfiguration werden nicht berücksichtigt.

JSON-Unmarshalling-Ansatz (empfohlen)

Ein eleganterer und flexiblerer Ansatz besteht darin, das Paket „encoding/json“ von Go zu verwenden und JSON-Daten in eine vorbereitete Standardkonfiguration zu entpacken. Diese Methode bietet mehrere Vorteile:

  • Behandelt fehlende Werte ordnungsgemäß:In der Dateikonfiguration fehlende Werte werden mit den Standardwerten aufgefüllt.
  • Überschreibt Standardwerte: Die in der Dateikonfiguration bereitgestellten Werte überschreiben die Standardwerte, unabhängig von ihrem Wert Typ.
  • Unterstützt explizite Überschreibungen auf Nullwerte: Werte, die in der Dateikonfiguration explizit auf Null gesetzt werden, überschreiben Standardwerte ungleich Null.

Um dies zu demonstrieren Ansatz:

  1. Erstellen Sie eine Standardkonfigurationsstruktur defConfig mit Ihrem Standard Werte.
  2. Laden Sie die JSON-Daten aus der Datei in eine Zeichenfolgenvariable fileContent.
  3. Verwenden Sie json.NewDecoder(), um die JSON-Daten in defConfig zu entmarshalieren.

Beispielcode:

var defConfig = &Config{
    S1: "",
    S2: "",
    S3: "abc",
    S4: "def",
    S5: "ghi",
}

const fileContent = `{"S2":"file-s2","S3":"","S5":"file-s5"}`

err := json.NewDecoder(strings.NewReader(fileContent)).Decode(defConfig)
if err != nil {
    panic(err)
}

Diese Lösung stellt sicher, dass Werte in der Standardkonfiguration durch überschrieben werden Werte in der Dateikonfiguration und bietet so eine zuverlässige und flexible Möglichkeit, Strukturen desselben Typs zusammenzuführen.

Das obige ist der detaillierte Inhalt vonWie kann ich zwei Go-Strukturen desselben Typs effizient zusammenführen?. 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