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.
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 }
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.
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(&conf) if err != nil { panic(err) }
Dieser Ansatz bietet mehrere Vorteile:
Die Verwendung dieses Ansatzes mit der gegebenen Standardkonfiguration und dem Dateiinhalt erzeugt die folgende Ausgabe:
&{S1: S2:file-s2 S3: S4:def S5:file-s5}
Dies zeigt, dass:
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!