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><div class="code" style="position:relative; padding:0px; margin:0px;"><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
}
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:
Um dies zu demonstrieren Ansatz:
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!